我正在尝试在 Python 3.3.0 上使用 Tkinter 为一个简单的应用程序构建一个 GUI。我偶然发现了一个小小的编程怪癖,乍一看似乎是错误的。虽然它本身不是问题(它不会影响我的目标),但它以 Pythonic 的方式没有意义。
所以,这里是来源:
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"
按钮会按预期关闭窗口......但是问题就在这里。如果我运行这个简化版本的代码:
def foo():
def bar():
hee = "spam"
hee = "eggs"
print(hee)
bar()
print(hee)
foo()
>>> eggs
>>> eggs
我不应该访问hee
定义的 infoo()
并创建一个新hee
的 in bar()
。如果我现在要添加nonlocal hee
到bar()
def 的开头,输出:
>>> eggs
>>> spam
将是预期的。
所以,我的问题是为什么我能够root
在第一个示例中调用该对象而不首先将其声明为非本地对象?