全局变量和局部变量在任何语言中都会碰到,以下是在python使用中的经验总结:
变量作用域scope
Python的作用域一共有4中,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
以 L –> E –> G –> B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
Python除了def/class/lambda 外,其他如: if/elif/else/ try/except for/while并不能改变其作用域。定义在他们之内的变量,外部还是可以访问。
但是需要注意如果if被 def/class/lambda 包裹,在内部赋值,就变成了此 函数/类/lambda 的局部作用域。
在 def/class/lambda内进行赋值,就变成了其局部的作用域,局部作用域会覆盖全局作用域,但不会影响全局作用域。
全局变量
声明
- 全大写,放在文件开头处
- 使用global关键词
- 使用全局变量文件
使用
- 函数内部调用时,需要先声明调用的是全局变量,否则会默认是local,就会出现local variable ‘var’ referenced before assignment等错误
闭包closure
定义
如果在一个内部函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
py2.x中能在最内层访问外部函数中的变量,但是不能直接赋值。the only way you can change the value of a nonlocal variable is if it is mutable,比如list。
py3.x中可以使用关键词nonlocal
其他
globals()和locals()
global 和 globals() 是不同的,global 是关键字用来声明一个局部变量为全局变量。globals() 和 locals() 提供了基于字典的访问全局和局部变量的方式