原创声明:本文系博主原创文章,转载及引用请注明出处。

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修饰),如果在函数中没有再定义同名变量,可以在函数中当做全局变量使用。

【参考资料】

  1. https://www.cnblogs.com/z360519549/p/5172020.html
  2. https://blog.csdn.net/chaoguo1234/article/details/81278013
  3. https://blog.csdn.net/carolzhang8406/article/details/6855525
  4. https://www.cnblogs.com/summer-cool/p/3884595.html

最新文章

  1. Codeforces Round #342 (Div. 2) C. K-special Tables 构造
  2. QTP自动化测试权威指南 连载(一)
  3. SQL SERVER中变量的定义、赋值与使用
  4. 企业架构研究总结(33)——TOGAF架构内容框架之架构制品(上)
  5. TextView 设置图片
  6. [PHP] MIME邮件协议的multipart类型
  7. 把.zip文件转化为.tar.gz文件
  8. bzoj3124: [Sdoi2013]直径 树形dp two points
  9. JVM核心知识体系(转http://www.cnblogs.com/wxdlut/p/10670871.html)
  10. SDRAM学习笔记(二)
  11. jquery append、prepend、before等等
  12. 基于Linux的Samba开源共享解决方案测试(五)
  13. Alpha版会议总结
  14. 实验四:终极改造之使用EF
  15. 编程之美 set 13 光影切割问题
  16. Vue清除所有JS定时器
  17. Real-Time SQL Monitoring using DBMS_SQLTUNE
  18. HBase-存储-KeyValue格式
  19. JavaScript之DOM实践
  20. (转载)arcgis for js - 解决加载天地图和WMTS服务,WMTS服务不显示的问题,以及wmts服务密钥。

热门文章

  1. 求帮助 html5三次贝塞尔曲线问题
  2. MariaDB知识点总结03--从主+多主集群
  3. day31 socket套接字编程
  4. pramfs安装
  5. Linux 安装 openoffice
  6. IDEA安装Git
  7. Sentence Screen Fitting
  8. Kudu建表语句
  9. ArrayList类的set()方法
  10. HDU1285(拓扑排序裸题