局部变量、类变量和实例变量的名称解析不一致

2024-04-29 00:03:55 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有这样一个函数:

x = 10
def foo():
    print(x)
    x = 20
    print(x)

调用foo首先抛出一个UnboundLocalErrorprint。所以看起来符号表是在解析时构造的。但这与类变量的名称解析不一致。
例如:

x = 10
class A:
    print(x)
    x = 20
    print(x)

打印1020。因此类的符号表在其运行时被更新。你知道吗

成员变量也是如此。你知道吗

class A:
    x = 10 
    def foo(self): 
        print(self.x)
        self.x = 20
        print(self.x)
a = A()
a.foo()

打印1020。实例的符号表将在运行时再次更新。第一个print(self.x)不会因为后面有赋值而抛出。你知道吗

这种不一致背后的原因是什么? 为什么函数的符号表不能在运行时更新呢?是否纯粹出于性能原因?你知道吗


Tags: 实例函数self名称foodef原因成员