命名空间和作用域
命名空间检索优先级
作用域
Python的作用域一共有4种,分别是:
- L(Local):最内层,包含局部变量,比如一个函数/方法内部。
- E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
- G(Global):当前脚本的最外层,比如当前模块的全局变量。
- B(Built-in): 包含了内建的变量/关键字等。,最后被搜索
规则顺序: L –> E –> G –>gt; B。
在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
作用域
python只有模块(module)、类以及函数(def,lambda)才会引入新的作用于,其他的代码块(如,if/else,try/except,for/while等)是不会引入新的作用域的,语句内定义的变量,外部也可以访问。
全局变量,局部变量问题
实例
x=10 def fun(): x=11 print(x) fun() print(x)
按照正常的方式,第二个print应该是11
11 10
实际上是10,python的编程规则与C++的不同,全局变量可以引用,但是就需要global和nonlocal关键字。
x=10 def fun(): global x x=11 print(x) fun() print(x)
这样,就可以直接改变x的值
global适用于全局作用域,nonlocal适用于嵌套作用域
另外一种
x=10 def fun(): x=x+1 print(x) fun() print(x) >>>Traceback (most recent call last): File "C:/Users/24201/Desktop/python学习/test.py", line 5, in <module> fun() File "C:/Users/24201/Desktop/python学习/test.py", line 3, in fun x=x+1 UnboundLocalError: local variable 'x' referenced before assignment
也就是说,可以访问,但不可修改
修改a为全局变量,通过函数参数传递,可以正常输出结果
x=10 def fun(x): x=x+1 print(x) fun(x) print(x)