代码 1
x = 0
class Foo:
print(x)
x = 1
print(x)
print(x)
结果 1
0
1
0
代码 2
x = 0
def foo():
print(x)
x = 1
print(x)
foo()
结果 2
UnboundLocalError: local variable 'x' referenced before assignment.
为什么可以x
从两个命名空间中引用对象class block
?
我不明白为什么Code 1
不扔一个UnboundLocalError
.
函数和类之间的不一致困扰着我。
更新:
以下是块:模块、函数体和类定义。...[跳过]...
如果名称绑定在块中,则它是该块的局部变量,除非声明为非局部变量。如果名称绑定在模块级别,则它是一个全局变量。(模块代码块的变量是局部变量和全局变量。)如果变量在代码块中使用但没有在代码块中定义,则它是自由变量。
如果名称绑定操作发生在代码块内的任何位置,则块内名称的所有使用都被视为对当前块的引用。如果在绑定之前在块中使用名称,这可能会导致错误。这个规则很微妙。Python 缺少声明,并允许名称绑定操作在代码块中的任何位置发生。代码块的局部变量可以通过扫描块的整个文本以进行名称绑定操作来确定。