python中的nonloca和global

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的nonloca和global相关的知识,希望对你有一定的参考价值。

   在python中,每一个变量都含有自己的定义域,甚至相同名字的变量在不同的函数内都有着不同的定义域,实际上,相同的变量名在不同的函数中就已经不是同一个函数了,因为该变量的定义域被改变了,一个定义域在模块级别的变量如果不加修饰的被封锁在函数内部,即便名字相同,但实际上也是俩个不同的变量。其在函数内部被引用时,实际上是在函数内部又创造了一个与该变量相同名字(但在内存中位置不同)的变量,请看下面的例子:
 
技术分享

 

 
count一开始作为定义域在模块级别的变量被定义,而在函数内部仅仅作为他的一个副本被使用。也可以看出模块级别的变量count和函数内部的局部变量count的内存地址(id)是不一样的。
 
如果想实现在函数内部改变变量,可以将函数内部的变量声明为全局变量,用关键字 golbal 可以实现:
 
技术分享

 

 
可以看见,这两个count在内存中的位置是同一个内存块。但是如果这样使用golbal就是错误的:
技术分享

 

 
在python中,使用golbal关键字会将一个变量声明为一个全局变量,使他的作用域为模块级别。但是请记住,它并不能对某些函数内的变量副本产生影响,如下面的例子:
 
技术分享

 

 
在本例子中,一开始声明了一个模块级别的变量a,然后在b()方法内部有一个他的副本变量a(注意,这两个a是不同的变量),在内嵌函数bb()中声明了全局变量a=“haha”(注:这个变量作用域是全局的,但与a的副本不同),所以,内嵌函数中的变量再声明后会将一开始声明的模块即a销毁,并重新建立一个新的全局变量a(可以做实验看下a的地址是改变了的)。所以在这段程序中有两个变量,一个是全局变量a,作用域是模块级,另一个是副本a,作用域在b()方法之内而在bb()方法之外(注:这是函数作用域的开合关系)
 
 
在python中,内外层函数的定义域是相互独立且不同的,如果内层函数想调用外层函数的变量,需要使用关键字nonlocal来声明一个外层函数中该变量使用,可以在例子中看见,内层函数实现了对外层变量的调用,而非仅仅创造一个副本。
 
技术分享

 

 
最后再看一个例子:
 
技术分享

 

 
输出结果:
技术分享

 

 

以上是关于python中的nonloca和global的主要内容,如果未能解决你的问题,请参考以下文章

Python学习篇 Python中的变量和数据类型

Python基础.python 中的[:-1]和[::-1]

聊聊Python中的is和==

Python中的模块介绍和使用

博客目录

Python3 中的 str 和 bytes