我正在学习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
(第二个(、b
、e
、f
、g
和d
都在类名称空间中创建。每当您尝试从同一命名空间中访问a
时,它都会获得内部"ball"
值,但对于任何新的作用域,它都将首先尝试在其本地命名空间中查找a
,然后跳过类命名空间并使用全局命名空间。
对于d = a
,它在类名称空间内,"ball"
也是。对于g = lambda a=a: a
,当解析lambda函数内部的a
时,它会在本地命名空间中找到a
,该名称空间在类命名空间中设置为默认值,因此它解析为"ball"
。
对于所有其他名称空间,他们试图从本地名称空间访问a
,但找不到,所以请检查全局名称空间并在那里找到它。