LGB范围规则和在Python中使用"self"

1 python

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()
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码,我会得到"全局".但我不明白为什么.

通过调用实例g的Set()方法,变量str2现在位于实例g的名称空间中.然后,遵循LGB范围规则,实例g的命名空间是第一个可以找到str2的命名空间!所以,结果应该是"实例".

这是错的吗?

Eli*_*sky 6

这不是这个工作原理.print(str2)从方法内部访问全局str2.要访问该str2成员,请使用print(self.str2).

阅读此SO问题和答案以获取完整详细信息.摘录自那里:

在执行期间的任何时候,至少有三个嵌套的作用域,其名称空间可以直接访问:最内部作用域,首先搜索,包含本地名称; 任何封闭函数的名称空间,从最近的封闭范围开始搜索; 接下来搜索的中间范围包含当前模块的全局名称; 最外面的范围(最后搜索)是包含内置名称的命名空间.

这不包括类成员,因此您必须明确地引用它们self.