global 和 nonlocal 区别 Python

552 阅读1分钟

区别

两个关键词都允许局部作用中使用外部变量( 外层变量,全局变量)

  • global 全局变量 -> 局部变量
  • nonlocal 外层变量 -> 局部变量

原理

python 访问一个变量时,先要确定变量从那里来。

  1. 当前作用域
  2. 外层作用域
  3. 当前模块之全局变量
  4. 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()