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

 

 

 

【参考资料】

  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

 

posted @ 2019-07-22 10:40  怪猫佐良  阅读(520)  评论(0编辑  收藏  举报