赋值前引用的变量 - Python

use*_*274 1 python tkinter

我收到了错误......

a = a + b
UnboundLocalError: local variable 'a' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

如果我在开始时分配了两个变量a和b,我不明白为什么会发生错误.

from tkinter import *

a = 10
b = 12
def stopProg(e):
    root.destroy()

def addNumbers(e):
    a = a + b
    label1.configure(text= str(a))

root=Tk()
button1=Button(root,text="Exit")
button1.pack()
button1.bind('<Button-1>',stopProg)
button2=Button(root,text="Add numbers")
button2.pack()
button2.bind('<Button-1>',addNumbers)
label1=Label(root,text="Amount")
label1.pack()

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

iCo*_*dez 5

无论何时修改函数内的全局变量,都需要首先将该变量声明为全局变量.

因此,您需要为全局变量执行此操作,a因为您在其中进行了修改addNumbers:

def addNumbers(e):
    global a
    # This is the same as: a = a + b
    a += b
    # You don't need str here
    label1.configure(text=a)
Run Code Online (Sandbox Code Playgroud)

以下是global关键字的参考.


此外,我想指出,如果您使用以下command选项可以改进您的代码Button:

from tkinter import *

a = 10
b = 12
def stopProg():
    root.destroy()

def addNumbers():
    global a
    a += b
    label1.configure(text=a)

root=Tk()
button1=Button(root, text="Exit", command=stopProg)
button1.pack()
button2=Button(root, text="Add numbers", command=addNumbers)
button2.pack()
label1=Label(root, text="Amount")
label1.pack()

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

从来没有充分的理由使用绑定来代替command选项.