Python中命名空间与作用域使用总结(4)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5424570c827e43670b8e3a8ea68affcb.html