变量作用域
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
并不能改变其作用域。定义在他们之内的变量,外部还是可以访问。
注意:关于变量作用域,需要说明的是,当你在某个作用域内为变量赋值时,该变量被Python解释器自动视作该作用域的本地变量,并会取代任何上一层作用域中相同名称的变量。这就可能会造成一些疑惑,如下:
>>> x = 10>>> def foo():... x += 1... print x...>>> foo()Traceback (most recent call last): File "", line 1, in File " ", line 2, in fooUnboundLocalError: local variable 'x' referenced before assignment
因为x += 1相当于 x = x + 1,此处有对x赋值,所以按上面的解释,python会默认x视为本地局部变量,但是在本地局部变量列表确没有这个变量,所以报错
属性访问的优先级规则
a = A()
a.x的搜索链:
a.__dict__['x']
type(a).__dict__['x']
,- 逐级(mro)找出 type(a) 的超类(不包括 metaclasses) 的 dict[‘x’]
A.x的搜索链:
A.__dict__['x']
,- 逐级(mro)找出 type(a) 的超类(不包括 metaclasses) 的 dict[‘x’]