声明: 这篇文章很大程度上借鉴了 Global, Local and nonlocal Variables。
local
变量与其它的编程语言相同,在函数中声明的变量都是local
变量。做用域仅限于函数中,从函数外是访问不到的。php
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
变量。python
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