python属性访问的优先规则 及 变量作用域
2017-10-02 00:00
381 查看
摘要: 变量作用域
属性访问的优先级规则
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
Python除了
注意:关于变量作用域,需要说明的是,当你在某个作用域内为变量赋值时,该变量被Python解释器自动视作该作用域的本地变量,并会取代任何上一层作用域中相同名称的变量。这就可能会造成一些疑惑,如下:
因为x += 1相当于 x = x + 1,此处有对x赋值,所以按上面的解释,python会默认x视为本地局部变量,但是在本地局部变量列表确没有这个变量,所以报错
a.x的搜索链:
逐级(mro)找出 type(a) 的超类(不包括 metaclasses) 的 dict[‘x’]
A.x的搜索链:
逐级(mro)找出 type(a) 的超类(不包括 metaclasses) 的 dict[‘x’]
属性访问的优先级规则
变量作用域
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 "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: 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’]
相关文章推荐
- python 函数、函数式编程、变量作用域、函数__doc__属性
- python-类属性访问规则
- Python的类实例属性访问规则
- Python的类实例属性访问规则探讨
- Python 变量作用域 —— 命名空间与 LEGB 规则
- Python的类实例属性访问规则探讨
- Python 命名空间 及变量搜索规则 属性名称 属性名称 无点号运算的变量名
- Python 变量作用域
- Python变量访问权限控制的几种方法:单下划线、双下划线、__slots__、@property、__all__
- python之Class属性定义和访问
- python和ruby变量作用域对比
- Python3基础 __getattr__ 在访问一个不存在的属性时,新增提示功能
- python通过函数属性实现全局变量的方法
- Objective-C之成魔之路【8-访问成员变量和属性】
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
- Python_变量的作用域
- Python基础_私有变量访问限制
- Python 的变量作用域和 LEGB 原则
- python的闭包与变量作用域
- java 类继承两个父类,同名变量 public 比protected具有优先访问权限