我正在学习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
从未执行过...... …