🎅例如咱们经常使用的内置函数 print len input
x = 1 #全局名称空间 def foo(): #全局名称空间 y = 2 🎅注意,"if"下面的定义的变量名都是全局的 if 1 > 0 z = 3 #全局 if 3 > 0: p = 555 #全局
def f() x = 222 #局部名称空间 f() #函数调用结束失效
'内置名称空间'----->'全局名称空间'----->'局部名称空间'
'局部名称空间'----->'全局名称空间'----->'内置名称空间'
'局部名称空间'----->'全局名称空间'----->'内置名称空间'
重要概念:名称空间的嵌套关系是在函数定义阶段(检测语法)时肯定的,与函数调用的位置无关,与函数定义位置有关python
三种名称空间必需要有的是 : 内置名称空间, 全局名称空间闭包
查找优先级示例函数
🎅从"f2"局部开始找 x = 3 def f1(): x = 2 def f2(): x =1 print(x) f2() f1() # 1 🎅将"f2"局部的删除,就往上一层找,找到"f1" x = 3 def f1(): x = 2 def f2(): print(x) f2() f1() # 2 🎅再将"f1"里面的删除,因而找到了全局 x = 3 def f1(): def f2(): print(x) f2() f1() # 3
🎅在定义"f2"的以后,有定义了同一级别的"len",因此当打开函数"f2"运行的时候,本着优先级查找就先找到了"222" len = 111 def f1(): def f2(): print(len) # 222 len = 222 f2() f1() # 222
🎅在全局空间定义一个变量"x",函数"foo",在函数内部修改"x"的值 x = 111 def foo(): x = 222 foo() print(x) #111 #发现并没有软用 🎅使用"global"关键字以后 x = 111 def foo(): global x # 声明下面的"x"属于全局 x = 222 foo() print(x) #222 #发现成功了
🎅不作任何处理,此函数应该是打印"f2"函数下的"x = 333" x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): x = 444 f3() print(x) #333 f2() f1() # 333 🎅使用"nonlocal"关键字 x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): nonlocal x #将下面的"x = 444"变成了上一层的"x"的值 x = 444 f3() print(x) f2() f1() # 444 🎅若是外层函数都没有"x"这个值,报错 x = 111 #并不会去全局修改 def f1(): def f2(): def f3(): nonlocal x x = 444 f3() print(x) f2() f1() #报错