标签:变量 程序 nonlocal glob ges img 新建 内存地址 作用
在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
标签:变量 程序 nonlocal glob ges img 新建 内存地址 作用
原文地址:http://www.cnblogs.com/IsCerberus/p/7338084.html