我试图在python3.3.0上使用Tkinter为一个简单的应用程序构建一个GUI。 我偶然发现了一个编程上的小怪癖,乍一看似乎是错的。虽然这本身不是一个问题(它不会影响我的目标),但从Python的角度来说,它是没有意义的。在
所以,来源如下:
from tkinter import *
from tkinter import ttk
def foo():
def bar():
root.destroy()
root = Tk()
mainframe = ttk.Frame(root).grid(column=0, row=0)
ttk.Button(mainframe,text="Goodbye",command=bar).grid(column=1, row=1)
root.mainloop()
foo()
运行此命令并单击"Goodbye"
按钮将按预期关闭窗口。。。然而问题就在这里。如果我运行这个简化版本的代码:
我不会访问在foo()
中定义的hee
,也不会在bar()
中创建一个新的hee
。如果现在将nonlocal hee
添加到bar()
def的开头,则输出:
>>> eggs
>>> spam
会是预期的结果。在
所以,我这里的问题是为什么我能够在第一个示例中调用root
对象,而不首先声明它是非本地的?在
根据Short Description of Python Scoping Rules(另请参见The Python Tutorial),对象名范围解析根据LEGB规则(本地、封闭函数、全局变量、内置函数)进行。在
尽管如此,下面的例子说明了这一规则:
这与代码的简化版本之间的主要区别是显式地分配了一个名为}对象。找不到它,它开始将范围缩小到
hee
的变量。这里,bar()
中的pi.bar
首先在bar()
中查找{foo()
,其中首先声明pi
对象。在相关问题 更多 >
编程相关推荐