Python中变量spam的nonlocal赋值为何不被视为已有绑定?
问题解答
你的困惑核心是混淆了函数局部作用域的绑定和模块全局作用域的绑定,文档里的两处描述其实针对的是不同作用域的spam:
关于
nonlocal的描述,指向的是修改scope_test()函数局部作用域内的spam绑定:- 在
scope_test()里,spam = "test spam"已经在该函数的局部作用域创建了spam的绑定。 do_nonlocal()中的nonlocal spam声明,明确指定要修改外层(即scope_test())局部作用域的spam,所以执行后scope_test()里的spam被改成了"nonlocal spam",这完全符合文档第一部分的说明。
- 在
文档中“在
global赋值之前,spam没有已有绑定”,这里的spam指的是模块级的全局作用域的spam:- 在执行
do_global()之前,全局作用域里根本不存在spam这个变量。只有当do_global()执行了global spam声明并赋值后,才在全局作用域创建了spam的绑定。这和scope_test()局部作用域里的spam是两个完全独立的变量,彼此没有关系。
- 在执行
你可以直接验证这个逻辑:如果在scope_test()执行前尝试打印spam,会直接抛出NameError,说明全局作用域此时确实没有这个变量;而scope_test()内部的spam是该函数的局部变量,和全局的spam互不干扰。
内容的提问来源于stack exchange,提问作者maltuin
相关产品推荐
相关产品推荐

