赋值前引用的变量 - Python

时间:2013-12-22 02:41:19

标签: python tkinter

我收到了错误...

a = a + b
UnboundLocalError: local variable 'a' referenced before assignment

如果我在开始时分配了两个变量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()

3 个答案:

答案 0 :(得分: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)

以下是global关键字的参考。


此外,我想指出,如果您使用command的{​​{1}}选项,则可以改进您的代码:

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() 选项绝不是一个充分的理由。

答案 1 :(得分:1)

您正在修改全局变量。默认情况下,您可以从全局变量中读取值,而不将其声明为global,但要修改它们,您需要将它们声明为global,如下所示

global a
a = a + b

答案 2 :(得分:1)

这是你的答案:

这是因为当您对作用域中的变量进行赋值时,该变量将成为该作用域的局部变量,并在外部作用域中隐藏任何类似命名的变量。

请阅读:http://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value