Python 局部变量、类变量和实例变量的名称解析不一致
如果我有这样一个函数:Python 局部变量、类变量和实例变量的名称解析不一致,python,variables,scoping,Python,Variables,Scoping,如果我有这样一个函数: x = 10 def foo(): print(x) x = 20 print(x) 调用foo首先抛出一个UnboundLocalErrorprint。因此,看起来符号表是在解析时构造的。但这与类变量的名称解析不一致。 例如: x = 10 class A: print(x) x = 20 print(x) 打印10和20。因此,类的符号表在其运行时更新 成员变量也是如此 class A: x = 10
x = 10
def foo():
print(x)
x = 20
print(x)
调用foo首先抛出一个UnboundLocalError
print
。因此,看起来符号表是在解析时构造的。但这与类变量的名称解析不一致。例如:
x = 10
class A:
print(x)
x = 20
print(x)
打印10
和20
。因此,类的符号表在其运行时更新
成员变量也是如此
class A:
x = 10
def foo(self):
print(self.x)
self.x = 20
print(self.x)
a = A()
a.foo()
打印10
和20
。实例的符号表将在运行时再次更新。第一个print(self.x)
不会因为后面有一个赋值而抛出
这种不一致背后的理由是什么?
为什么函数的符号表不在运行时更新?这纯粹是出于性能原因吗 相关。也许有重复的地方?第三个例子与其他两个无关。在这里,您只需要拥有一个class属性,该属性随后会被实例属性遮蔽。