区别
两个关键词都允许局部作用中使用外部变量( 外层变量,全局变量)
- global 全局变量 -> 局部变量
- nonlocal 外层变量 -> 局部变量
原理
python 访问一个变量时,先要确定变量从那里来。
- 当前作用域
- 外层作用域
- 当前模块之全局变量
- python 内置变量
- 查找循序序号: 1 - 2 - 3 - 4 - 报错
- 创建的变量默认在当前作用域。
代码实例
a = 1
def fun():
print(a) # 在函数内部找不到对 a 的定义,则去外层查询。输出1。
fun()
a = 1
def fun():
a = 2 # 声明了一个局部变量,与外面等于1的那个a没有关系了
print(a) # 输出2
fun()
print(a) # 输出1
a = 1
def fun():
print(a) # 先引用外部的全局变量 a
a = 2 # 再修改全局变量 a, 发现冲突报错
fun()
a = 1
def fun():
global a # a为全局变量
print(a) # 输出1
a = 2 # 改变的是全局变量,因此出了这个局部作用域,仍然有效
fun()
print(a) # 输出2
nonlocal 使用方式,同理可得
def outer_fun():
a = 1
def fun():
nonlocal a # a为外层变量
print(a) # 输出1
a = 2
fun()
print(a) #输出2
outer_fun()