知识点:
global将一个变量变为全局变量
nonlocal改变最近的变量,又不是全局作用。
1.global
在python中,当引用一个变量的时候,对这个变量的搜索按找本地作用域(Local)、嵌套作用域(Encolosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。
m = 1 #全局 def fun1(): m = 2 #嵌套 def fun2(): m = 3 #本地 fun2() fun1()
当在函数中给一个变量赋值的时候,python总是创建或者改变本地作用域的变量名,因此你无法在一个函数外调用函数内的变量,也无法在函数内改变一个函数外的变量。就像下面
#外层无法引用内层变量 def fun1(): k = 10 fun1() print(k) 结果: Traceback (most recent call last): File "I:/untitled/cx/11月/11-17面向对象/1.属性.py", line 83, in <module> print(k) NameError: name ‘k‘ is not defined #内存无法改变外层变量 k = 100 def fun1(): k = k + 50 fun1() print(k) #结果 Traceback (most recent call last): ... UnboundLocalError: local variable ‘k‘ referenced before assignment
如果在函数中改变函数外的变量或者在函数外调用函数内的变量时,可以使用global。
global可以将一个变量变为全局变量。在内部改变或者在外部引用。
def fun1(): global k k = 50 fun1() print(k) 或者这样 k = 10 def fun1(): global k k = 50 fun1() print(k)
2.nonlocal
nonlocal可以在一个嵌套的函数中修改嵌套作用域中的变量,理论上是修改离它最近的变量,但不会改变全局。
#这是正常情况 def func3(): n = 1 def func4(): n = 2 def func5(): n = 5 print(n) #5 func5() print(n) #2 func4() print(n) #1 func3()
加入nonlocal之后
def func3(): n = 1 def func4(): n = 2 #最近的n = 5 def func5(): nonlocal n n = 5 print(n) #5 func5() print(n) #5 func4() print(n) #1 func3()
还可能这样:
def func3(): n = 1 #这里最近n =5 def func4(): # n = 2 def func5(): nonlocal n n = 5 print(n) #5 func5() print(n) #5 继承func3 func4() print(n) #5 func3()
不会改变全局
n =100 def func3(): n = 1 #这里最近n =5 def func4(): def func5(): nonlocal n n = 5 print(n) #5 func5() print(n) #5 继承func3 func4() print(n) #5 func3() #结果 5 5 5 100
时间: 2024-10-15 18:07:13