使用在函数中创建的相同变量到另一个函数

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 的解决方案是有效的,但是如果您可以这样做,使用全局变量确实不是一个好的做法。

您在这里可以做的是使用面向对象的编程。使用 numberlst_imgshowimage 属性以及两个 class 方法 go_forwardgo_backward 创建一个 class,可以修改 numbershowimage 属性。 我将如何开始:

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()
....