Python——变量的作用域
原创声明:本文系博主原创文章,转载及引用请注明出处。
1. 在编程语言中,变量都有一定的作用域,用来限定其生命周期,且不同类型的变量作用域不同。
在Python中解释器引用变量的顺序(优先级)为:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
2. 在局部作用域中引用外部变量时(即比当前局部作用域块更大时),如果需要修改局部作用域以外的变量,需要显式声明为global变量。
在python3中引入了nonlocal关键字,用来区分全局变量和非局部变量,即有: global > nonlocal > local
1) global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字;
2) nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
3. 在python2中要实现nonlocal的功能,参考:https://blog.csdn.net/chaoguo1234/article/details/81278013
4. 函数定义了本地作用域,而模块定义的是全局作用域。如果想要在函数内定义全局作用域,需要加上global修饰符。
5. 变量名解析:LEGB原则
当在函数中使用未认证的变量名时,Python搜索4个作用域:
- L:本地作用域,函数内部声明但没有使用global的变量;
- E:上一层结构中def或者lambda的本地作用域;
- G:全局作用域,函数中使用global声明的变量或在模块层声明的变量
- B:内置作用域,即python的内置类和函数等。
并且在第一处能够找到这个变量名的地方停下来。如果变量名在整个的搜索过程中都没有找到,Python就会报错。
补充说明:
上面的变量规则只适用于简单对象,当出现引用对象的属性时,则有另一套搜索规则:属性引用搜索一个或多个对象,
而不是作用域,并且有可能涉及到所谓的"继承"。
6. python中在模块层面定义的变量(无需global修饰),如果在函数中没有再定义同名变量,可以在函数中当做全局变量使用。
【参考资料】
- https://www.cnblogs.com/z360519549/p/5172020.html
- https://blog.csdn.net/chaoguo1234/article/details/81278013
- https://blog.csdn.net/carolzhang8406/article/details/6855525
- https://www.cnblogs.com/summer-cool/p/3884595.html
最新文章
- Codeforces Round #342 (Div. 2) C. K-special Tables 构造
- QTP自动化测试权威指南 连载(一)
- SQL SERVER中变量的定义、赋值与使用
- 企业架构研究总结(33)——TOGAF架构内容框架之架构制品(上)
- TextView 设置图片
- [PHP] MIME邮件协议的multipart类型
- 把.zip文件转化为.tar.gz文件
- bzoj3124: [Sdoi2013]直径 树形dp two points
- JVM核心知识体系(转http://www.cnblogs.com/wxdlut/p/10670871.html)
- SDRAM学习笔记(二)
- jquery append、prepend、before等等
- 基于Linux的Samba开源共享解决方案测试(五)
- Alpha版会议总结
- 实验四:终极改造之使用EF
- 编程之美 set 13 光影切割问题
- Vue清除所有JS定时器
- Real-Time SQL Monitoring using DBMS_SQLTUNE
- HBase-存储-KeyValue格式
- JavaScript之DOM实践
- (转载)arcgis for js - 解决加载天地图和WMTS服务,WMTS服务不显示的问题,以及wmts服务密钥。