Python函数之globals、locals、global、nonlocal
1.内置函数globals locals
-
a = 100 lst = [11, 22, 33] # print(globals()) # 获取全局作用域(内置空间与全局空间)变量与值的对应关系。 # print(locals()) # def func(): # b = 200 # dic = {'name': 'barry'} # print(globals()) # 始终获取全局作用域(内置空间与全局空间)变量与值的对应关系。 # print(locals()) # 当前作用域的变量与值的对应关系。 # # func() def func(): b = 200 dic = {'name': 'barry'} def inner(): c = 150 set1 = {1, 2, 3} print(globals()) # 始终获取全局作用域(内置空间与全局空间)变量与值的对应关系。 print(locals()) # 当前作用域的变量与值的对应关系。 inner() func()
2.关键字 global nonlocal
-
引子
# 例一:临时名称空间,引用全局名称空间的变量 可以。 # a = 1 # # # def func(): # print(a) # # # func() # 例二: 临时名称空间,引用全局名称空间的可变的数据类型 可以。 # lst = [11, ] # # # def func(): # lst.append(666) # # func() # print(lst) # 例三: 先使用一个变量,在定义这个变量,顺序不对,报错。 # def func(): # print(a) # a = 100 # # # func() 例四:临时名称空间可以引用全局空间的变量,但是不能改变。 a = 1 def func(): a = a + 1 func()
-
global
-
默认情况下临时名称空间可以引用全局空间的变量,不能修改,如果使用global关键字,在临时名称空间修改全局名称空间的变量。
a = 1 def func(): global a a = a + 1 print(a) func() print(a)
-
在临时名称空间可以创建一个全局名称空间的变量。
def func(): global name name = 'barry' # print(name) func() print(name)
-
-
nonlocal
这个关键字不能修改全局变量,但是可以在内层函数修改外层函数(非全局)的变量。
# # 例一:内层函数可以引用外层函数的变量。 # def wrapper(): # a = 1 # def inner(): # print(a) # inner() # # wrapper() # # 例二:内层函数可以引用外层函数的变量,但是不能修改外层函数的变量。 # def wrapper(): # a = 1 # # def inner(): # a += 1 # inner() # # # wrapper() # 例三:内层函数可以引用外层函数的变量,但是不能修改外层函数的变量,如果需要修改,使用nonlocal。 def wrapper(): a = 1 def inner(): nonlocal a a += 1 print(a) inner() wrapper() # 例四: def wrapper(): a = 1 def inner(): nonlocal a a += 1 print(a) inner() print(a) wrapper()