python nonlocal 的具体原理
很多文章都大概列了下nonlocal的具体用法,比如看到几篇文章写的
“nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量”
看完以后我感觉自己是懂了,但光从这句话来说还没完全理解它的真实含义nonlocal
def make_average():
series=[]
def average(new_value):
series.append(new_value)
total = sum(series)
return. total/len(series)
return averager
average = make_average()
average(10). -> 10
average(11). - >10.5
series 是make_average 的局部变量,当average=make_average()以后,make_average()已经返回了,本地作用域已经一去不返
其实在average函数中 series是自由变量,并未在本地作用域中绑定的变量
可以通过average__code__.co_varname 查看局部变量, average.__code__.co_freevars 查看自由变量
series 绑定在返回的average的__closure__属性中, average.__closure__, average__closure__[0].cell_contents 里面存储series里的数据
但如果把series改为了int 类型的不可变类型在average里面尝试改变它的值时就会报错,这时候如何处理,就需要加nonlocal ,它的作用就是变量申明为自由变量
结论:
如果在内部函数中只是仅仅读外部变量,可以不在此变量前加nonlocal
如果在内部函数中尝试进行修改外部变量,且外部变量为不可变类型,则需要在变量前加nonlocal,如果变量为可变类型,则不需要添加nonlocal
最新文章
- [翻译]开发文档:android Bitmap的高效使用
- js中参数不对应问题
- C语言中结构体赋值问题的讨论
- 数据类型安全验证都交给TryParse吧
- LoadRunner 12 发布,主推云
- java实现抓取某公司官网新闻
- c语言for语句
- 调试EF源码
- ios应用view之间数据传递的方式
- 捕获arm非托管磁盘虚拟机,并进行还原
- python套接字编程实现ntp服务和远程命令执行
- BZOJ 2754 【SCOI2012】 喵星球上的点名
- 『Yaml』配置文件读写包
- 1. easyui tree 初始化的两种方式
- c/c++ 按照行读取文件
- 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符。 (#1113)
- PHP is_null,empty以及isset,unset的区别
- 【二分】Defense Lines
- 对于网站,APP开发流程的理解
- PuTTY连接Linuxserver常常断线解决方式