i = 1 def f1(): i = 2 def f2(): print(i) return f2 func = f1() func() print(i)
先别看答案,想想输出结果!
第一种输出结果:
1
1
第二种输出结果:
1
1
第三种输出结果:
2
1
为什么会这样呢?上面说到过,函数的作用域是静态的,由函数声明的位置决定,在哪里声明,就决定了它的上层作用域是谁,这与调用函数的位置无关。无论在哪里调用,它都会去函数本身的作用域中的命名空间找,找不到在去上一层的命名空间找,切记未必是在调用该函数的作用域的命名空间找。对于第三种情况,是最让我费解的地方,func = f1()执行完之后,f1的命名空间被销毁,按理说就找不到i=2了,但是输出结果确实是2,所以我只能用LEGB搜索法则解释。(如果你知道为什么,请给我留言,感激不尽……)
(8)情况8:class A(object): a = 2 def fun(self): print(a) new_class = A() new_class.fun()
代码运行后报错:NameError: name 'a' is not defined。上文中说过,Python类成员变量与成员函数都有自己的作用域,且各作用域平级。(用作用域的生命周期来解释也行,但是真心觉得不对劲)。
5 总结Python的作用域与命名空间有的时候真的让人很费解,我本以为与Java等语言类似的,没想多还是挺有区别的。有些情况我到现在也没想通,例如作用域与命名空间的生命周期,用生命周期来解释上面的一些例子,总觉得不对劲。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx