我正在学习Python,现在我正在讨论范围和非本地语句.在某些时候,我以为我想到了这一切,但随后非本地人来了,打破了一切.
示例1:
print( "let's begin" )
def a():
def b():
nonlocal x
x = 20
b()
a()
Run Code Online (Sandbox Code Playgroud)
自然运行失败.
更有趣的是,print()不会被执行.为什么?.
我的理解是封闭def a()在执行之前print()不会执行,嵌套def b()只在a()被调用时执行.我很迷惑...
好的,让我们尝试第2个例子:
print( "let's begin" )
def a():
if False: x = 10
def b():
nonlocal x
x = 20
b()
a()
Run Code Online (Sandbox Code Playgroud)
Aaand ......它运行良好.Whaaat?这是怎么解决的?x = 10在函数a中永远不会执行!
我的理解是在运行时评估和执行非本地语句,搜索封闭函数的调用上下文并将本地名称绑定x到某个特定的"外部" x.如果x外部函数中没有- 引发异常.再次,在运行时.
但现在看来这是在语法分析时完成的,非常愚蠢的检查"看看外部函数x = blah,如果有这样的东西 - 我们很好",即使x = blah从未执行过...... …