【问题标题】:Variable referenced before assignment - Python赋值前引用的变量 - Python
【发布时间】:2014-01-10 14:53:10
【问题描述】:

我收到错误消息...

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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    每当你在一个函数中修改一个全局变量时,你首先需要将该变量声明为全局变量。

    因此,您需要对全局变量 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 选项从来都不是很好的理由。

    【讨论】:

    • 在我参加过的所有讲座中,我从来没有看过这个。非常感谢!
    • @user3080274 - 很高兴能提供帮助!请不要忘记accept an answer
    • 我能问一下这里的 'e' 是什么 - 'def stopProg(e)' 吗?谢谢。
    • @Amber.G - 保存将由.bind() 传递给函数的事件对象。你会注意到我从更新的代码中删除了它,因为我们现在使用command,它不发送事件对象。
    【解决方案2】:

    这是你的答案:

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

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

    【讨论】:

      【解决方案3】:

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

      global a
      a = a + b
      

      【讨论】:

        猜你喜欢
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多