博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python属性访问的优先规则 及 变量作用域
阅读量:6566 次
发布时间:2019-06-24

本文共 956 字,大约阅读时间需要 3 分钟。

hot3.png

变量作用域

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的搜索链:

  1. a.__dict__['x']
  2. type(a).__dict__['x'],
  3. 逐级(mro)找出 type(a) 的超类(不包括 metaclasses) 的 dict[‘x’]

A.x的搜索链:

  1. A.__dict__['x'],
  2. 逐级(mro)找出 type(a) 的超类(不包括 metaclasses) 的 dict[‘x’]

 

转载于:https://my.oschina.net/u/914655/blog/1546544

你可能感兴趣的文章
object-c语言的nonatomic,assign,copy,retain的区别
查看>>
Ubuntu12.04版本安装arm-linux-gcc 4.3.3
查看>>
js 正则之检测素数
查看>>
linux-多线程
查看>>
中国版 Ubuntu Kylin 14.04 LTS 麒麟操作系统中文版发布下载 (Ubuntu天朝定制版)
查看>>
hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)
查看>>
第40周二
查看>>
用户注册
查看>>
使用虚拟机运行Ubuntu时,主机与宿主机共享文件的方法。
查看>>
做一个略调皮的个人主页--相册与随笔篇
查看>>
EJB究竟是什么,真的那么神奇吗??
查看>>
Python 转义符
查看>>
海茶3 らぶデス3 入门经典教程
查看>>
pstree命令
查看>>
css选择器顺序的小技巧
查看>>
C#之自己定义的implicit和explicit转换
查看>>
dojo 学习笔记之dojo.query - query(id) 与query(class)的差别
查看>>
Java基础加强总结(三)——代理(Proxy)
查看>>
一步一步写算法(之hash表)
查看>>
C99规范
查看>>