LGB范围规则与Python中的“self”使用

1 投票
3 回答
556 浏览
提问于 2025-04-16 06:28
str2 = "Global"

class InClass:
 str2 = "Class"
 def Set(self, msg):
  self.str2 = msg
 def Print(self):
  print(str2)

g = InClass()
g.Set("Instance")
g.Print()

我运行这段代码时,结果是“Global”。但我不明白为什么。

通过调用实例 g 的 Set() 方法,变量 str2 现在在实例 g 的命名空间里。然后,根据 LGB 的作用域规则,实例 g 的命名空间是第一个可以找到 str2 的地方!所以,结果应该是“Instance”。

这是错的吗?

3 个回答

0

因为你定义了 str2 = "Global",所以 Python 解释器会默认使用这个值。我同意 Eli 的说法。如果你想打印出来,那么你必须明确地写 print(self.str2),这样才能访问类里面的变量 str2 = "Class"。

如果你写 print g.str2 (这会输出 Class 的值)。

6

这不是正确的用法。print(str2) 在方法内部会访问全局的 str2。如果你想访问类里面的 str2,应该用 print(self.str2)

想了解更多细节,可以看看这个 StackOverflow的问题和回答。这里有一段摘录 来自那里

在执行过程中,至少有三个嵌套的作用域,它们的命名空间是可以直接访问的:最内层的作用域是第一个被搜索的,它包含局部变量;任何外层函数的命名空间会被搜索,从最近的外层作用域开始;接下来搜索的是中间作用域,它包含当前模块的全局变量;最后搜索的是最外层的作用域,它包含内置的变量。

这不包括类的成员,所以你必须用 self 来明确引用它们。

2

selfself.__class__ 在 Python 中永远不会在查找作用域时被自动搜索。

撰写回答