离柒 发表于 2023-9-13 17:02:39

小白求问LEGB的相关内容

x = 1
def test():
    x = 2
    print(x)
    class C:
      x = 3
      print(x)
      def m1(self):
            print(x)
            print(self.x)
      def m2(self):
            x = 4
            print(x)
            self.x = 5
      def m3(self):
            print(x)
            print(self.x)
      c = C()
      c.m1()
      c.m2()
      c.m3()

求问classC下面的x = 3是属于LEGB的哪一个?

isdkz 发表于 2023-9-13 17:02:49

在这个例子中,class C下面的x = 3属于L(Local)。

LEGB是Python中变量作用域的规则,其中L(Local)表示本地作用域,即函数或类中定义的变量。在这个例子中,x = 3是在类C的定义中定义的,因此它在类C的本地作用域中。在类的方法中,使用self.x来引用类C的实例变量x,而在方法m1和m3中,使用print(x)来引用本地变量x,它们都指的是在函数test中定义的本地变量x,值为2。在方法m2中,使用x = 4创建了一个新的本地变量x,它的作用域仅限于方法m2中。self.x = 5将类C的实例变量x的值更改为5。

离柒 发表于 2023-9-13 17:20:01

isdkz 发表于 2023-9-13 17:02
在这个例子中,class C下面的x = 3属于L(Local)。

LEGB是Python中变量作用域的规则,其中L(Local)表 ...

那请问为什么print(x)引用的是本地变量x=2(按我的理解它应该是属于嵌套函数的外层作用域E?),而不是x = 3?{:5_99:}

isdkz 发表于 2023-9-13 17:30:46

离柒 发表于 2023-9-13 17:20
那请问为什么print(x)引用的是本地变量x=2(按我的理解它应该是属于嵌套函数的外层作用域E?),而不是x...

chatgpt的回答是错误的,x = 3 并不在LEGB的范畴,而是在 C 这个类的命名空间中的

isdkz 发表于 2023-9-13 17:31:25

页: [1]
查看完整版本: 小白求问LEGB的相关内容