繁体   English   中英

赋值之前引用的变量-Python

[英]Variable referenced before assignment - Python

我遇到了错误...

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

每当在函数内部修改全局变量时,都需要首先将该变量声明为全局变量。

因此,您需要对全局变量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关键字的参考。


另外,我想指出的是,如果您使用Buttoncommand选项,则可以改进您的代码:

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

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

您正在修改全局变量。 默认情况下,您可以从全局变量中读取值,而无需将它们声明为global ,但是要修改它们,您需要像这样将它们声明为global

global a
a = a + b

这是你的答案:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM