函数 命名空间以及作用域
---恢复内容开始---
命名空间 (namespace 名称空间)
每一个函数,变量都拥有自己的命名空间
内置命名空间
python解释器启动后就可以使用的名字
全局命名空间
写在函数外面的变量名
局部命名空间
调用函数后函数开辟的命名空间
三种命名空间的加载与取值顺序
加载顺序:内置命名空间(程序运行前加载)>全局命名空间(程序运行中从上到下)>局部命名空间(程序运行中调用时才加载)
取值顺序:
在局部调用:局部命名空间>全局命名空间>内置命名空间
在全局调用:全局命名空间>内置命名空间
作用域:一个名字可以使用的区域
全局作用域:
内置命名空间和全局命名空间中的名字都属于全局作用域
局部作用域:
局部命名空间的名字属于局部作用域
局部作用域可以使用全局作用域中的变量
而全局作用域不能使用局部作用域中的变量
n = 10 def func(): m = n+1 print(m) print(n)#10 print(m)#报错
局部作用域还可嵌套更小的局部作用域
函数嵌套的调用 def func2() # 1 print("in func2 now") #5 def func(): # 2 func2() # 4 n=20 # 6 print(n) # 7 func() # 3 in func2 now 20
def func(): #1 def func1():#3 print("我是谁")#5 func1()#4 func() #2 我是谁 函数嵌套的定义
n = 10 def func(): n=9 def func1(): n=8 def func2(): m = n+1#会调用最近的变量 print(m) func2() func1() func() 9
作用域链
小范围作用域可以使用大范围的变量,但作用域链是单向的,不能反向应用
小范围虽然可以使用大范围的,却不能修改
如果想要修改全局的:使用global关键字 ——尽量避免
如果想要修改外层函数的:使用nonlocal——不影响全局
n = 1 def func(): n=n+1 func() print(n)#会报错,局部变量不能修改全局变量 n = 1 def func(): global n n=n+1 func() print(n)#打印2 #通过global()关键字可以让局部作用域修改全局作用域
n = 1 def func(): n=3 def func1(): n =2 def func2(): global n#修改全局变量 n=n+1 print(n)#2 func2() func1() func() print(n)#2 n = 1 def func(): n=3 def func1(): n =2 def func2(): nonlocal n#修改最近函数中的变量 n=n+1 print(n)#3 func2() print(n)#3 func1() func() print(n)#1
globals和locals方法
globals() 保存了在全局作用域中的名字和值
locals() 保存了执行的位置的作用域中的名字和值
如果在全局执行globals()和locals()打印的结果是一致的

浙公网安备 33010602011771号