Python程序中,创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为“命名空间”,也被称之为“作用域”。python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。
Python中,只有当变量在模块(Module)、类(Class)、函数(def、lambda)中定义的时候,才会有作用域的概念,其他如在if-elif-else、for-else、while、try-except\try-finally等关键字的语句块中并不会产成作用域。看例子:
# 场景1
def func():
variable = 100
print (variable)
print (variable) #NameError: name 'variable' is not defined
# 场景2
if True:
variable = 100
print (variable) #100
print ("******")
print (variable) #100
Python的变量作用域有4种:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
- 查找规则是:L –> E –> G –>B ,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找;
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
globalVar = 100 #G
def test_scope():
enclosingVar = 200 #E
def func():
localVar = 300 #L
print __name__ #B
在Python中,使用一个变量时并不严格要求需要预先声明,但在真正使用之前,它必须被绑定到某个内存对象(被定义、赋值);这种变量名的绑定将在当前作用域中引入新的变量,同时屏蔽外层作用域中的同名变量,如:
# 示例1
def func():