关于 Python 中的 global/nonlocal 关键字

Posted by Yun on Mon, Jun 3, 2019

1. Python 变量作用域

Python 的变量作用域可以分下面四种:

  • Local:局部作用域
  • Enclosing:闭包函数外的函数作用域
  • Global:全局作用域
  • Built-in:内建作用域

查找变量会逐级别查找(L、E、G、B)。这里值得注意的是,Python 具备块级作用域,而是一种类似于函数作用域的形式。

2. Python 变量的定义

Python 无需声明便直接定义变量,但是如下例:

 1a = 1
 2b = 99
 3
 4def print_two(x, y):
 5    print(x)
 6    print(y)
 7
 8def function_test():
 9    a = 2
10    print_two(a, b)
11
12function_test()
13print_two(a, b)

运行时输出为:

12
299
31
499

可知,在内部作用域中,可以直接引用全局作用域中变量的值,但是无法直接进行赋值修改操作。

3. global 关键字

如例子所示:

 1a = 1
 2b = 99
 3
 4def print_two(x, y):
 5    print(x)
 6    print(y)
 7
 8def function_test():
 9    global a
10    a = 2
11    print_two(a, b)
12
13function_test()
14print_two(a, b)

运行结果:

12
299
32
499

global 关键字的作用是,在局部作用域中,使用全局变量。若不涉及全局变量的修改(只是单纯引用),也可以不使用 global 关键字。

4. nonlocal 关键字

示例代码:

 1a = 1
 2
 3def test():
 4    a = 2
 5    def test1():
 6        a = 3
 7        def test2():
 8            nonlocal a
 9            a = 4
10            print(a)
11        test2()
12        print(a)
13    test1()
14    print(a)
15
16test()
17print(a)

运行结果:

14
24
32
41

即 nonlocal 关键字,用来在局部作用域中使用外层(非全局)变量。

5. 关于全局变量

在 Python 中,另一种使用全局变量的方式,就是使用单独的 global.py 文件,存储所有的全局变量,可以进行引用和修改。

参考链接


版权声明:本文遵循 CC BY-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

Copyright statement: This article follows the CC BY-SA 4.0 copyright agreement. For reprinting, please attach the original source link and this statement.