博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的nonloca和global
阅读量:4658 次
发布时间:2019-06-09

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

   在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来声明一个外层函数中该变量使用,可以在例子中看见,内层函数实现了对外层变量的调用,而非仅仅创造一个副本。
 

 

 
最后再看一个例子:
 

 

 
输出结果:

 

 

转载于:https://www.cnblogs.com/IsCerberus/p/7338084.html

你可能感兴趣的文章
小程序数据绑定的拓展用法
查看>>
DRF 版本 认证
查看>>
MVC 4将jQuery升级到1.9出现各种问题。。。
查看>>
JedisPool资源池优化
查看>>
第2次作业+105032014140
查看>>
JS防抖与节流
查看>>
redhat enterprixe 5.0 DNS 服务配置与管理
查看>>
Django ORM不完全操作
查看>>
hdu2089
查看>>
windows下使用PHP实现定时执行脚本
查看>>
Linux下常用的压缩与解压命令
查看>>
第一周的博客作业
查看>>
linux的awk命令解读
查看>>
JavaScript内部原理实践——真的懂JavaScript吗?(转)
查看>>
android5.0之toolBar
查看>>
POJ--2689-C++
查看>>
better-scroll的使用方法,动态创建dom使用better-scroll
查看>>
PHP中的面向对象魔术方法大全
查看>>
数据库常用函数详解
查看>>
jquery 监听不起效果的小问题汇总
查看>>