博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
global与nonlocal关键字
阅读量:6441 次
发布时间:2019-06-23

本文共 1261 字,大约阅读时间需要 4 分钟。

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

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

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

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

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

举例说明:

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

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

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

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

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

 

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

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

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

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

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

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

 

转载于:https://www.cnblogs.com/Yang-Sen/p/9135582.html

你可能感兴趣的文章
解决Java连接MySQL存储过程返回参数值为乱码问题
查看>>
c++ 字符检测 TCharacter
查看>>
MalformedObjectNameException: Invalid character '' in value part of property
查看>>
Hadoop格式化HDFS报错java.net.UnknownHostException: localhost.localdomain: localhost.localdomain
查看>>
android 40 Io编程
查看>>
STL之Vector(不定长数组)
查看>>
Ext江湖
查看>>
一起谈.NET技术,实战ASP.NET大规模网站架构:Web加速器
查看>>
RHEL 6.6下Python 2.6.6升级到Python 3.6.6
查看>>
linux 内核启动过程以及挂载android 根文件系统的过程 ( 转)
查看>>
shell每日更新(7)
查看>>
单词的个数
查看>>
从程序员到项目经理(27):怎样给领导汇报工作
查看>>
eclipse工程 'cocostudio/CocoStudio.h' file not found
查看>>
045医疗项目-模块四:采购单模块—采购单提交(Dao,Service,Action三层)
查看>>
dockerfile创建php容器(安装memcached、redis、gd、xdebug扩展)
查看>>
转:面对JXTA,我迷茫了
查看>>
IT人必须学会的职场四原则
查看>>
Android之剪贴薄实现
查看>>
Sonix SN9P701 OCR点读笔二维码识别源码
查看>>