先看下面这段代码,显然无法work. 因为代码试图在TestVariableScope()中引用一个没有被定义的变量a.所以必须报错,如下图-1.
不过如果你将第2行代码注释掉。代码就能跑通了,如图-2。
问题1来了:TestVariableScope.a 不是也没有被定义吗,为什么可以work呢?解释如下:先看代码第8行,TestVariableScope.a在SetVariable方法中被定义了,SetVariable()又 在TestVariableScope()前被调用。所以TestVariableScope()在被调用的时候TestVariableScope.a已经被定义了。
问题2来了:代码第7行,a也被定义了。为什么TestVariableScope()在引用a是报错呢。区别在于:a 只是SetVariable()中的一个local变量,TestVariableScope当然无法引用SetVariable中定义的局部变量了。因为违反了LEGB原则吗。TestVariableScope.a 就不一样了,他是一个全局变量哦。所以TestVariableScope当然可以访问这个全局变量了,完全不违反LEGB原则。
问题3来了:为什么TestVariableScope.a是个全局变量,而a却不是呢。因为python中函数皆是对象,而且是全局对象。TestVariableScope.a其实就是TestVariableScope这个全局对象下的一个变量而已,自然也是全局变量喽。 见图-3
1 def TestVariableScope(): 2 print(a) 3 print(TestVariableScope.a) 4 TestVariableScope.a=13 5 6 def SetVariable(): 7 a=12 8 TestVariableScope.a=12 9 10 if __name__==‘Demo‘: 11 print(‘Demo is running‘) 12 13 if __name__ == ‘__main__‘: 14 SetVariable() 15 TestVariableScope() 16 b=TestVariableScope 17 b()
图-1
图-2
图-3
时间: 2024-10-16 03:41:08