spam
在 nonlocal
函数中被指定为 do_nonlocal()
,根据 Python 文档,这会更改 spam
的 scope_test绑定。但文档还指出,在全局分配之前没有先前对
spam
的绑定。 do_nonlocal()
在do_global()
之前调用,这将spam
的范围扩展到了scope_test()
。那么,为什么 spam
仅在声明 global
后才被视为绑定,即使文档似乎另有说明?
请注意
赋值(默认)并未更改 scope_test 的local
绑定。spam
赋值更改了scope_test对nonlocal
的绑定,spam
赋值更改了模块级绑定。global
您还可以看到在
赋值之前没有对spam
进行任何绑定。global
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
不太清楚你不明白什么,但是,但这是基本解释。
您有三个不同的变量,全部名称为
spam
。全局变量、scope_test
内的变量、do_local
内的变量。你的每一个内在功能都会改变其中的一个不同的功能。
当您在
print(...., spam)
内写入 scope_test
时,您会看到分配给 scope_test
版本的 spam
的最后一个值。当您在全局级别调用相同的打印语句时,您将看到全局值。