python中的global和nonl

声明: 这篇文章很大程度上借鉴了Global, Local and nonlocal Variables

local变量

与其它的编程语言相同,在函数中声明的变量都是local变量。作用域仅限于函数中,从函数外是访问不到的。

In [1]: def f():              s = 'local val'              print('read s from interval:', s)    In [2]: print(s)  NameError: name 's' is not defined    In [3]: f()  read s from interval: local val

global变量

在源文件中(非函数或类)声明的变量默认是global变量。

  • 在函数中可以随意读取global变量,这一点不多说,不管是函数声明在前,还是global变量声明在前
  • 涉及到修改global变量的时候,要特别注意了: 如果在函数体中未使用global声明这个变量,那么函数体中修改的是local变量的值,global变量并未更新。
In [4]: s = 'global val'    In [6]: def f():     ...:     s = 'change global val'     ...:     print('change global val', s)     ...:    In [7]: f()  change global val change global val    In [8]: s  Out[8]: 'global val'

正确的做法应该是:

In [4]: s = 'global val'    In [6]: def f():     ...:     global s     ...:     s = 'change global val'     ...:     print('change global val', s)     ...:    In [7]: f()  change global val change global val    In [8]: s  Out[8]: 'change global val change global val'

nonlocal变量

nonlocalpython3引入的,只能用于嵌套函数中。在嵌套函数中使用nonlocal声明变量,可以修改外层函数中的变量。

In [11]: def outer():      ...:     s = 'outer val'      ...:     def inner():      ...:         nonlocal s      ...:         s = 'inner val'      ...:         print('change outer s',s)      ...:     print('before inner(), s=', s)      ...:     inner()      ...:     print('after inner(), s=', s)      ...:    In [12]: outer()  before inner(), s= outer val  change outer s inner val  after inner(), s= inner val