声明: 这篇文章很大程度上借鉴了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
变量
nonlocal
是python3
引入的,只能用于嵌套函数中。在嵌套函数中使用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