python——global和nonlocal详解
global
简介
global关键字用来在函数或其他局部作用域中使用全局变量。
global作用域是全局的,就是会修改这个变量对应地址的值。
注意
-
global 语句是一个声明,它适用于整个当前代码块。 这意味着列出的标识符将被解释为全局变量。 尽管自由变量可能指的是全局变量而不被声明为全局变量。
-
global 语句中列出的名称不得用于该全局语句之前的文本代码块中。
-
global 语句中列出的名称不能定义为形式参数,也不能在 for 循环控制目标、 class 定义、函数定义、 import 语句或变量注释中定义。
-
当前的实现并不强制执行这些限制,但是程序不应该滥用这种自由,因为未来的实现可能会强制执行这些限制,或者悄悄地改变程序的含义。
示例
global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。
count = 0
def global_test():
gcount+=1
print (count)
global_test()
以上代码会报错:第一行定义了全局变量,在内部函数中又对外部函数进行了引用并修改,那么python会认为它是一个局部变量,又因为内部函数没有对其count进行定义和赋值,所以报错。
如果局部要对全局变量修改,则在局部声明该全局变量。
count = 0
def global_test():
global count
count+=1
print (count)
global_test() #1
print(count) #1
如果局部不声明全局变量,并且不修改全局变量,则可以正常使用。
count = 0
def global_test():
print (count)
global_test() #0
global只修改内部作用域的值并不修改外部作用域的值
def outer():
num = 10
def inner():
global num
num = 100
print(num)
inner()
print(num)
outer()
#100
#10
从结果我们可以看出来,global定义的关键字并不会向上一层群寻找嵌套的函数,它的作用就是让当前域的变量是可以发生改变的而并不会像nonlocal一样去改变外部的值。
def outer():
global num
num = 10
def inner():
global num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
#100
#100
如果当外部函数的作用变量也是用global定义的,那么就是全局变量了,再inner函数中就可以修改它了。
nonlocal
简介
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
注意
-
nonlocal只在闭包里面生效,作用域就是闭包里面的,外函数和内函数都影响,但是闭包外面不影响。
-
nonlocal 语句使列出的标识符引用除 global 变量外最近的封闭范围中的以前绑定的变量。 这很重要,因为绑定的默认行为是首先搜索本地名称空间。 该语句允许封装的代码将变量重新绑定到除全局(模块)作用域之外的本地作用域之外。
-
nonlocal 语句中列出的名称与 global 语句中列出的名称不同,它们必须引用封闭范围中已经存在的绑定(无法明确确定应在其中创建新绑定的范围)。
示例
a=100
print('全局变量',a)
def test1():
nonlocal a
a=200
print('test1中修改全局变量a',a)
def test2():
print('tes2中使用全局变量',a)
test1()
test2()
报错,因为没有嵌套一个函数。
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
#100
#100
使用nonlocal关键字修改了num的值,inner这个函数会往上面去找一个局部变量num,然后修改num的值。
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
def make_counter_test():
mc = make_counter()
print(mc())
print(mc())
print(mc())
make_counter_test() # 1 2 3

浙公网安备 33010602011771号