如何检查Python中的局部和全局作用域并覆盖类中的变量



我正在学习Python范围,无法理解程序,这是我的代码

a = "bat"
class Test():
a = "ball"    
b = [a for i in range(2)]
e = lambda: a
@staticmethod
def f():
return a

g = lambda a=a: a
d = a
print(Test.b)  # prints ["bat","bat"]
print(Test.e()) # prints bat
print(Test.f()) # prints bat
print(Test.g()) # prints ball
print(Test.d)  # prints ball

这里我已经声明了变量a="a";bat";在类之外,然后我声明变量a="0";球;内部类,该类对它是本地的;球;在类内部,它是如何返回变量a="a"的;bat";在前3次打印中在类外声明&不在最后两张照片里?

创建一个类时,该类会有一个新的命名空间。a(第二个(、befgd都在类名称空间中创建。每当您尝试从同一命名空间中访问a时,它都会获得内部"ball"值,但对于任何新的作用域,它都将首先尝试在其本地命名空间中查找a,然后跳过类命名空间并使用全局命名空间。

对于d = a,它在类名称空间内,"ball"也是。对于g = lambda a=a: a,当解析lambda函数内部的a时,它会在本地命名空间中找到a,该名称空间在类命名空间中设置为默认值,因此它解析为"ball"

对于所有其他名称空间,他们试图从本地名称空间访问a,但找不到,所以请检查全局名称空间并在那里找到它。

最新更新