global and nonlocal
使用这两个关键字之前,我们先了解一下什么是变量的作用域
- 变量的作用域:是指一个变量所产生的作用范围,也就是说在哪一个范围内变量能够被解释器所识别。
- 变量分为:全局变量and局部变量
- 全局变量的作用域:全局变量一般声明在函数的外部。整个.py文件内都可以使用,都可以被识别。
- 局部变量的作用域:只能在函数的内部使用,超出范围,变量就不能再使用
> global关键字
用来在函数或其他局部作用域中使用全局变量,如果不修改全局变量也可以不使用global关键字。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量
number = 0
def small_test():
number += 1
print (number)
small_test()
UnboundLocalError: local variable ‘number’ referenced before assignment
局部变量错误:局部变量“number”在赋值前被引用
如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有gcount的定义和赋值,所以报错。
如果在局部要对全局变量修改,需要在局部也要先声明该全局变量(如下代码)
number = 0
def small_test():
global number # 声明变量number为全局变量
number += 1
print (number) # 1
small_test()
print(number) # 1
在局部如果不修改全局变量,则可以正常使用全局变量(如下代码)
number = 0
def small_test():
print(number)
small_test()
> nonlocal关键字
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量,修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
def make_counter():
number = 0
def counter():
nonlocal number
number += 1
return number
return counter
def small_test():
m = make_counter()
print(m()) # 1
print(m()) # 2
print(m()) # 3
print(m()) # 4
small_test()
总结
- global 表示将变量声明为全局变量
- 在嵌套函数中,使用父级函数中的变量,只能在子函数内引用,如果要在子函数内修改,必须在子函数里面声明 “global 变量”,表明是修改外面的全局变量
- global 定义的变量,表明其作用域在局部以外,即局部函数执行完之后,不销毁函数内部以global定义的变量
- nonlocal 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量)