很多文章都大概列了下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

最新文章

  1. [翻译]开发文档:android Bitmap的高效使用
  2. js中参数不对应问题
  3. C语言中结构体赋值问题的讨论
  4. 数据类型安全验证都交给TryParse吧
  5. LoadRunner 12 发布,主推云
  6. java实现抓取某公司官网新闻
  7. c语言for语句
  8. 调试EF源码
  9. ios应用view之间数据传递的方式
  10. 捕获arm非托管磁盘虚拟机,并进行还原
  11. python套接字编程实现ntp服务和远程命令执行
  12. BZOJ 2754 【SCOI2012】 喵星球上的点名
  13. 『Yaml』配置文件读写包
  14. 1. easyui tree 初始化的两种方式
  15. c/c++ 按照行读取文件
  16. 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符。 (#1113)
  17. PHP is_null,empty以及isset,unset的区别
  18. 【二分】Defense Lines
  19. 对于网站,APP开发流程的理解
  20. PuTTY连接Linuxserver常常断线解决方式

热门文章

  1. Pandas的常见使用方法操作
  2. springboot整合admin管理平台
  3. 如何开始使用 Akka
  4. VS Code 最好用的 Markdown 插件
  5. jQuery_完成表单注册检验
  6. JAVA使用easyexcel操作Excel
  7. kotlin 简单处理 回调参数 加?
  8. Java期末课程学习汇总。
  9. LeetCode 39. 组合总和(Combination Sum)
  10. python第一个程序:计算体脂率