使用在函数中创建的相同变量到另一个函数
using same variable that is created in function into another function
我想使用从函数创建的 'number' 变量,并在几个函数中使用它,还给它一个初始值 0,但它给出了“之前引用的局部变量 'number' code.How 最后一行的 assignment" 错误,我可以修复它吗?提前致谢。
lst_img=[img0,img1,img2,img3,img4]
number=0
def go_forward():
global number
number+=1
shwimage.grid_forget()
global shwimage1
shwimage1=Label(image=lst_img[number])
shwimage1.grid(row=0,column=0,columnspan=3)
def go_back():
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
问题是您将数字变量用作全局变量。
你还必须告诉go_back()
使用全局变量:
def go_back():
global number #add this
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
global
告诉函数使用全局 number
所以每个函数都必须单独告诉它,否则它将默认使用本地版本。
在你的两个函数中使用 global number
:
lst_img=[img0,img1,img2,img3,img4]
number=0
def go_forward():
global number
number+=1
shwimage.grid_forget()
global shwimage1
shwimage1=Label(image=lst_img[number])
shwimage1.grid(row=0,column=0,columnspan=3)
def go_back():
global number
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1
出现错误 local variable 'number' referenced before assignment
的一个原因是您没有使用 global
关键字来声明即使在 go_back()
中也将使用 number
变量。
一个简单的解决方法是在go_back()
中使用global
,如下:
def go_back():
global number # -> as you did in `go_forward()`.
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
但是,您在使用 global
时需要谨慎行事,因为它很难跟踪变量的变化。相反,最好将 number
值作为参数传递给函数。
有关使用 global
关键字的更多信息,请在此处查看问题的答案:Why are global variables evil?
此外,我推荐你阅读这篇文章,Alternatives to Using Globals in Python
我也相信 go_back() 函数,你试图引用全局变量 number 但它没有指示函数使用全局 number 变量。
def go_back():
global number #This line needs to be addded
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1
其他答案在 go_back
中添加 global number
的解决方案是有效的,但是如果您可以这样做,使用全局变量确实不是一个好的做法。
您在这里可以做的是使用面向对象的编程。使用 number
、lst_img
和 showimage
属性以及两个 class 方法 go_forward
和 go_backward
创建一个 class,可以修改 number
和 showimage
属性。
我将如何开始:
class ImageViewer:
# Class constructor
def __init__(self, lst_img):
self.lst_img = lst_img
self.number = 0 # number is always 0 at the beginning
self.showimage = None
def go_forward(self):
if self.number == len(self.lst_img)-1 :
return
else:
self.number += 1
# ... add your code ....
if self.showimage is None:
# code to create a showimage...
self.showimage = .....
else:
# code to update the showimage...
def go_backward(self):
if self.number == 0:
return
else :
self.number -= 1
if self.showimage is None:
# code to create a showimage...
self.showimage = .....
else:
# code to update the showimage...
# Create an viewer instance with a list of images
lst_img = [img1, img2, img3]
viewer = ImageViewer(lst_img)
# Now you can use the go_forward and go_backward methods to naviguate in your images
viewer.go_forward()
viewer.go_forward()
viewer.go_backward()
....
我想使用从函数创建的 'number' 变量,并在几个函数中使用它,还给它一个初始值 0,但它给出了“之前引用的局部变量 'number' code.How 最后一行的 assignment" 错误,我可以修复它吗?提前致谢。
lst_img=[img0,img1,img2,img3,img4]
number=0
def go_forward():
global number
number+=1
shwimage.grid_forget()
global shwimage1
shwimage1=Label(image=lst_img[number])
shwimage1.grid(row=0,column=0,columnspan=3)
def go_back():
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
问题是您将数字变量用作全局变量。
你还必须告诉go_back()
使用全局变量:
def go_back():
global number #add this
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
global
告诉函数使用全局 number
所以每个函数都必须单独告诉它,否则它将默认使用本地版本。
在你的两个函数中使用 global number
:
lst_img=[img0,img1,img2,img3,img4]
number=0
def go_forward():
global number
number+=1
shwimage.grid_forget()
global shwimage1
shwimage1=Label(image=lst_img[number])
shwimage1.grid(row=0,column=0,columnspan=3)
def go_back():
global number
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1
出现错误 local variable 'number' referenced before assignment
的一个原因是您没有使用 global
关键字来声明即使在 go_back()
中也将使用 number
变量。
一个简单的解决方法是在go_back()
中使用global
,如下:
def go_back():
global number # -> as you did in `go_forward()`.
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
但是,您在使用 global
时需要谨慎行事,因为它很难跟踪变量的变化。相反,最好将 number
值作为参数传递给函数。
有关使用 global
关键字的更多信息,请在此处查看问题的答案:Why are global variables evil?
此外,我推荐你阅读这篇文章,Alternatives to Using Globals in Python
我也相信 go_back() 函数,你试图引用全局变量 number 但它没有指示函数使用全局 number 变量。
def go_back():
global number #This line needs to be addded
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1
其他答案在 go_back
中添加 global number
的解决方案是有效的,但是如果您可以这样做,使用全局变量确实不是一个好的做法。
您在这里可以做的是使用面向对象的编程。使用 number
、lst_img
和 showimage
属性以及两个 class 方法 go_forward
和 go_backward
创建一个 class,可以修改 number
和 showimage
属性。
我将如何开始:
class ImageViewer:
# Class constructor
def __init__(self, lst_img):
self.lst_img = lst_img
self.number = 0 # number is always 0 at the beginning
self.showimage = None
def go_forward(self):
if self.number == len(self.lst_img)-1 :
return
else:
self.number += 1
# ... add your code ....
if self.showimage is None:
# code to create a showimage...
self.showimage = .....
else:
# code to update the showimage...
def go_backward(self):
if self.number == 0:
return
else :
self.number -= 1
if self.showimage is None:
# code to create a showimage...
self.showimage = .....
else:
# code to update the showimage...
# Create an viewer instance with a list of images
lst_img = [img1, img2, img3]
viewer = ImageViewer(lst_img)
# Now you can use the go_forward and go_backward methods to naviguate in your images
viewer.go_forward()
viewer.go_forward()
viewer.go_backward()
....