1.函数作用域介绍

函数作用域

Python中函数作用域分为4种情况:

  • L:local,局部作用域,即函数中定义的变量:
  • E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的。
  • G:global,全局变量,即模块级别定义的变量,在模块开始、函数外定义的变量。
  • B:built-in,系统固定模块里的变量,比如int,bytearray等。

搜索变量的优先级顺序依次是:局部作用域 > 外层作用域 > 当前模块中全局作用域 > python内置作用域,也就是

L > E > G > B

实例说明:

2.作用域产生

Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的,如下代码:

  • if 2 > 1 :
  • x = 2
  • print(x) #2

if并没有引入一个新的作用域,x仍处在当前作用域中,后面代码可以使用。

  • def test():
  • x = 2
  • print(x) # NameError: name 'x' is not defined

def、class、lambda是可以引入新作用域的。

3.global关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了,当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下,代码如下:

age =
def change_age() :
global age # 声明一个age全局变量
print( '修改前: %s',age)
age =
print(' 修改后: %s', age )
change_age()
# 修改前:
#修改后 :

4. nonlocal关键字

global关键字声明的变量必须在全局作用域上,不能嵌套作用域上,当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量怎么办呢,这时就需要nonlocal关键字了。

def outer():
count =
def inner():
nonlocal count
print('修改前:%s',count)
count =
print('修改后:%s ' ,count)
inner()
print(count)
outer()
#修改前:
#修改后:
#

5.小结:

(1)变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;

(2)只有模块、类、及函数才能引入新作用域;

(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;

(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字,nonlocal是python3新增的关键字。

最新文章

  1. 在公司里面,如何让笔记本连上wifi?
  2. MapGuide Maestro 5.1发布了
  3. 【HDU】2147 kiki's game
  4. innobackupex err2
  5. POJ 2486 Apple Tree(树形DP)
  6. The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemF:Faster, Higher, Stronger
  7. Visual C++ unicode and utf8 转换
  8. PHP数组操作汇总
  9. Java接口修饰符详解
  10. 开源word操作组件DocX的记录
  11. 代码走查工具StyleCop建议采用的规则总结
  12. jsp如果超过字数就变成...
  13. Unity 特殊文件夹 Assets Resources StreamingAssets Editor Plugins......
  14. 浅析Spring MVC工作机制
  15. java 事件处理
  16. Django2.0 正则表示匹配的简单例子
  17. mysql数据库数据的 备份以及还原
  18. Redis集群架构【转载】
  19. mysql5.6优化
  20. VB网络编程中Winsock的使用

热门文章

  1. tomcat官方下载连接——安装版&绿色版
  2. Android中获取手机电量信息
  3. scala mapPartitionsWithIndex函数的使用
  4. JSON和GSON的使用
  5. Treflection06_调用静态方法
  6. css tips —— 神奇的max-width,min-width, width覆盖规则
  7. js 小复习2
  8. 为啥YII2 会出现 mcrypt_generic_init(): Key size is 0
  9. uva 10891 区间dp+记忆化搜索
  10. vue2项目中better-scroll 插件使用时候页面不滚动