在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。

然而当在一个函数内部为一个变量赋值时,并不是按照上面所说LEGB规则来首先找到变量,之后为该变量赋值。在Python中,在函数中为一个变量赋值时,有下面这样一条规则:

“当在函数中给一个变量名赋值是(而不是在一个表达式中对其进行引用),Python总是创建或改变本地作用域的变量名,除非它已经在那个函数中被声明为全局变量. ”

global适用于函数内部修改全局变量的值

nonlocal适用于嵌套函数中内部函数修改外部变量的值

举例说明:

x = 1
def f1():x = 2
f1()
print(x)  #输出 1

在上面的程序当中先定义了一个全局变量x=1,也就是说现在全局名称空间现在有了一个x=1,接下来在f1函数当中又给x赋值为2,但是因为在f1函数当中没有变量x,所以python会在f1函数这个本地作用域创建一个变量x,也就是说这个x只存在于本地作用域,并非是全局变量中的那个x。而后运行程序打印的那个x会优先找到全局变量中的x,所以最后会输出1。

如果想在函数内部修改全局变量x,就需要用到global关键字:

x = 1
def f1():global xx = 2
f1()
print(x)  #输出 2

使用global关键字就是在告诉python,我们要在局部作用域使用全局变量,所以在x=2语句当中,python不会再在本地作用域中再新建一个变量,而是直接使用全局变量中的x变量

nonlocal关键字的作用与global类似,举例:

def f1():a = 250def f2():a = 520f2()print(a)
f1()   # 输出 250

在这个程序当中,在嵌套的f2函数当中,对变量a的赋值,同样因为在本地作用域中没有x,python会在f2函数的内存空间在创建一个新的变量a,如果想要修改嵌套作用域中的a,就要使用关键字nonlocal

def f1():a = 250def f2():nonlocal aa = 520f2()print(a)
f1()   # 输出 520

使用了nonlocal关键字就是告诉python,我们要在f2函数中使用外部变量a,所以我们在f2函数内对a变量进行赋值时就使用的是外部变量a,而不是重新创建出来的变量

注意:使用global关键字修饰的变量之前可以并不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在,否则会报错。

global与nonlocal相关推荐

  1. global 和 nonlocal关键字

    当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了. def fun(): global num1 num1=2 print("函数内修改后num1=&qu ...

  2. python函数教程:global 和 nonlocal的详细用法

    global 方法 我们来看下面这段代码: b = 100 def func():b = b + 1return b print(func()) 这段代码看上去中规中矩,似乎没有什么问题,但是程序运行 ...

  3. python global和nonlocal用法解析

    这篇文章主要介绍了python global和nonlocal用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 global和nonlocal ...

  4. 动态参数与global和nonlocal

    1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序: 位置,*args,默认值,**kwargs 在形参上*聚合, **聚合 在实参上*打散, **打散 ...

  5. python学习-类(global、nonlocal、继承、多态)

    文章目录 global与nonlocal 继承和多态 global与nonlocal 1.函数内部定义的为局部变量,其作用域是局部作用域,函数外无法调用的 2.函数外定义的为全局变量,其作用域是全局作 ...

  6. 一个例子带你搞懂python作用域中的global、nonlocal和local

    在编程中,只要接触过函数的,我相信都理解什么是全局变量和局部变量,概念比较简单,这里就不做解释了.在python中,用global语句就能将变量定义为全局变量,但是最近又发现有个nonlocal,一时 ...

  7. nonlocal python3_Python 中的 global、nonlocal 辨析

    global 语句 语法:声明此变量为全局变量 用法: global [变量名] 注意:引用全局变量时,不需要global 声明,但是后面使用或者修改这个全局变量的时候,需要global声明. 应用场 ...

  8. Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)...

    Python Day 10  函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal) 名称空间(命名空间): 当程序运行时,代码从上至下一次读取,遇到变量与值, ...

  9. python nonlocal的用法_python global和nonlocal用法解析

    这篇文章主要介绍了python global和nonlocal用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ◆global和nonloca ...

  10. [转载] python不允许使用关键字_Python中关键字global与nonlocal的区别

    参考链接: Python全局关键字 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634 ...

最新文章

  1. linux设备驱动归纳总结
  2. C#导入Excel2010出现加载DLL失败或者类库未注册的问题,0x8002801D或者0x80029C4A .
  3. 2009-08 台湾印象
  4. 2009-08-19股市大跌分析(转载)
  5. Chevereto图片托管php源码_亲测-分享最新微信付费进群收费进群系统源码-附带搭建教...
  6. Check for Palindromes(算法)
  7. 二叉树先序、中序和后序遍历
  8. 图片区域帧差法识别物体_matlab
  9. screw-plus实现php代码安全
  10. echarts 获取点击的y轴数值_ECharts关系图
  11. 怎么通过当地时区计算格林尼治_时间规划局:时间能看到,标注在你的手臂上,那时的你会怎么样...
  12. 机器人机构学的数学基础——绪论
  13. java请求菜鸟快递接口返回乱码
  14. 用Python可视化18万条《八佰》影评,看看观众怎么说?
  15. 面向毕业、职称的SCI论文高效写作方法
  16. 【算法设计与分析】分支限界法解决单源最短路径问题:输入带权图G=(V,E)以及出发顶点s,然后用分支限界法解决问题,要求输出路径和长度以及计算时间;
  17. Word中更新图表所有的域
  18. arcgis如何打开tif_ArcGIS的目录、内容列表的布局
  19. Ix Chariot测试路由器流程
  20. 直播|BIA Separations 和元生物两位大咖关于质粒DNA的制造工艺和质量控制

热门文章

  1. grafana模板大全
  2. 软件设计模式-装饰器模式-工厂模式
  3. 索尼:蓝光电影价格不会下调
  4. Matlab FFT变换细节(信号采样频率,FFT变换点数,频率分辨率)
  5. linux服务器备份软件下载,五大Linux开源服务器备份软件
  6. WPF TabControl Styles
  7. 数据仓库(4)基于维度建模的数仓KimBall架构
  8. 上海亚商投顾:A股三大指数震荡涨跌各异 大消费全天活跃
  9. js、vue、手机号、身份证号、姓名脱敏
  10. 便携式明渠流量计的使用特点