LGB范围规则与Python中的“self”使用
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
self
和 self.__class__
在 Python 中永远不会在查找作用域时被自动搜索。