1,python中,名称空间分三种:
-
全局命名空间
-
局部命名空间(临时命名空间)
-
内置名称空间
2,作用域(两种):
1,全局作用域 包含:全局名称空间 内置名称空间
2,局部作用域 包含:局部命名空间
2.1,取值顺序:
就近原则:局部名称空间 --> 全局名称空间 --> 内置名称空间 单向从小到大范围
2.2, 加载顺序:
内置名称空间 --> 全局名称空间(当程序执行时) -- > 局部名称空间(当函数调用的时候)
3,函数的嵌套:
def func1(): print(111) def func2(): print(222) func1() print(333) print(666) func2() print(555)
def func1(): print(222) def func2(): print(333) print(111) func2() print(666) func1() # 执行结果: 222 111 333 666
4,global nonlocal
局部名称空间对全局名称空间的变量可以引用,但是不能改变。
count = 1 def func1(): count = 2 print(count) func1() count = 1 def func1(): # count = 3 count = count + 1 # local variable 'count' referenced before assignment print(count) func1()
报错原因: 如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,但是对于上面的例题,局部中没有定义,所以他会报错,
global
1,在局部名称空间声明一个全局变量。
声明
2,在局部名称空间声明可以对全局变量进行修改。
count = 1 def func1(): global count count = count + 1 print(count) func1() print(count)
nonlocal
1,子函数对父函数的变量进行修改。
2,此变量不能是全局变量
3,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def func1(): count = 666 def inner(): print(count) def func2(): nonlocal count count += 1 print("func2",count) func2() print("inner",count) inner() print("funcl",count) func1() # 运行结果: 666 func2 667 inner 667 funcl 667