在python中,函数名也是标识符,一个标识符的可见范围,就是标识符的作用域。一般常说的是变量的作用域。在python中没有常量,只有字面常量。
python中有全局作用域和局部作用域。
全局作用域:
- 在整个程序运行环境中都可见
局部作用域:
- 在函数内部可见
- 局部变量的使用范围不能超过其所在的局部作用域
在嵌套函数中,外层变量作用域可在内层作用域可见;内层作用域中,如果定义了i=1,相当当前作用域重新定义了一个新的变量i,但是这个i并没有覆盖外层作用域中的i。
def counter():
i = 0
while True:
i = 1
i += 1
yield i
全局变量(global):
- 使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x。
- 全局作用域中必须有x的定义,没有会报NameError。
x = 5
def foo():
global x
x += 1
下面这种写法是错误的:
x = 5
def foo():
x += 1
函数内部x += 1其实是 x = x + 1,赋值即重新定义,相当于在foo内部定义一个局部变量x,那么foo内部所有的x都是这个局部变量x了,但是这个x还没有完成赋值,就被右边拿来做加1操作了。
global使用原则:
- 外部作用域变量会在内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离。
- 如果函数需要使用外部全局变量,请使用函数的形参传参解决
- 不用global
变量名解析原则:LEGB
- Local,本地作用域、局部作用域的local命名空间。函数调用时创建,调用结束消亡。
- Enclosing,python2.2时引入了嵌套函数,实现了闭包,这个就是嵌套函数的外部函数的命名空间。
- Global,全局作用域,即一个模块的命名空间。模块import时创建,解释器退出时消亡。
- Build-in,内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡。