python 命名空间 global 和 nonlocal
命名空间
命名空间的分类:
1)全局命名空间: >>在py文件中,在函数外声明的变量都属于全局命名空间
2)局部命名空间: >>在自定义函数中声明的变量是局部命名空间
3)内置命名空间: >>存放在python解释器为我们提供的名字中,
如: list, tuple, str, int 这些都是内置命名空间
a = 10 # 全局名称空间中的内容 def fn(): # fn也在全局名称空间 b = 20 # 局部名称空间 print(a) #不能改变a的值,但是可以查看 def gn(): print(a) fn() #10 gn() #10
加载顺序:
内置命名空间 >> 全局命名空间 >> 局部命名空间 (函数调用时)
取值顺序:
局部 >> 全局 >> 内置
取值顺序:
1 a=10 2 def fun(): 3 a=20 4 print(a) 5 fun() #20
作用域:
1) 全局作用域: 全局命名空间 + 内置命名空间
2) 局部作用域: 局部命名空间
可以通过 globals() 函数查看全局作用域的内容,也可以通过 locals() 来查看局部作用域中的变量和函数信息.
1 a = 110 # 全局 2 def fn(): # 3 b = 20 # 局部 4 def gn(): # 局部 5 print(globals()) # 可以查看全局作用域中的内容 6 print(locals()) # 查看当前作用域中的内容 7 gn() 8 fn()
函数的嵌套
1) 只要遇见了 () 就是函数的调用, 没有 () 就不是函数的调用.
2) 函数执行的顺序
1 def outer(): 2 print("哈哈") 3 def inner_1(): 4 print("呵呵") 5 def inner_1_1(): 6 print("嘻嘻") 7 inner_1_1() 8 print("吼吼") 9 def inner_2(): 10 print("嘿嘿") 11 inner_2() 12 inner_1() 13 outer() 14 #哈哈 嘿嘿 呵呵 嘻嘻 吼吼
global 和 nonlocal
glocal 是将全局变量引入函数内部
1 a = 10 # 全局变量本身就是不安全的, 不能随意修改 2 def func(): 3 global a # 1. 可以把全局中的内容引入到函数内部 , 2. 在全局创建一个变量 4 # a = 20 5 a += 10 # a = a+10 6 print(a) #20 7 func()
nonlocal 是寻找外层函数中离他最近的那个变量, 不包含全局变量
1 func() 2 print(a) 3 a = 10 4 def outer():# 5 def inner(): # 在inner中改变a的值 6 nonlocal a # 寻找外层函数中离他最近的那个变量 7 a = 20 8 inner() 9 outer()
小题:
1 a = 1 2 def fun_1(): 3 a = 2 4 def fun_2(): 5 nonlocal a 6 a = 3 7 def fun_3(): 8 a = 4 9 print(a) 10 print(a) 11 fun_3() 12 print(a) 13 print(a) 14 fun_2() 15 print(a) 16 print(a) 17 fun_1() 18 print(a) 19 # 1 2 3 4 3 3 1