python nonlocal的用法_python nonlocal 的具体原理[通俗易懂]

python nonlocal的用法_python nonlocal 的具体原理[通俗易懂]很多文章都大概列了下nonlocal的具体用法,比如看到几篇文章写的“nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量”看完以后我感觉自己是懂了,但光从这句话来说还没完全理解它的真实含义nonlocaldefmake_average():series=[]defaverage(new_value):series.append(new_value)total=sum(s…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196948.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 借助Unity AR Foundation构建跨平台AR应用

    借助Unity AR Foundation构建跨平台AR应用

    2021年6月19日
    96
  • redflag linux7,RedFlag Linux7 update firefox 3.52

    redflag linux7,RedFlag Linux7 update firefox 3.52RedFlagLinux7updatefirefox3.52红旗LINUX7更新FIREFOX3.5.2操作步骤:1、用psaux|grepfirxfox查看firefox详细路径[@more@][sam@samhost~]$psaux|grepfirefoxsam27600.31.61166449612?Sl2…

    2022年8月20日
    4
  • UML——类图

    UML——类图UML——类图

    2022年4月24日
    44
  • Java–String、StringBuilder及StringBuffer区别及性能对比

    Java–String、StringBuilder及StringBuffer区别及性能对比【学习背景】主要是想通过OpenJDK提供的JMH工具测试下String、StringBuilder及StringBuffer字符串拼接的效率如何~关于JMH的介绍及具体使用,我的这篇博文中有介绍:Java–☀️面试官:LinkedList真的比ArrayList添加元素快?❤️‍本文通过OpenJDKJMH带你揭开真相《⭐建议收藏⭐》当然,除了主要验证三者的字符串拼接效率之外,还会对三者做一些区别分析及常见面试问题总结,希望加深自己对这三者的认知,分享出来,也希望能帮助到有需要的小伙伴~

    2022年6月28日
    22
  • cbow模型详解_老C模型

    cbow模型详解_老C模型引言前面我分析了Word2vec的一种模型叫做skip-gram模型。在这篇文章中,我将讲述另一个word2vec模型——连续词袋模型(CBOW)模型。如果你理解skip-gram模型,那么接下来的CBOW模型就更好理解了,因为两者模型互为镜像。我们先来看看CBOW模型与skip-gram模型对比图:如何,这是不是镜像关系?所以接下来的讲解也会和skip-gram那篇文章极其类似。前向传播接

    2022年9月7日
    3
  • Ubuntu 18.04 固定 NFS 端口

    Ubuntu 18.04 固定 NFS 端口NFS本身是没有提供信息传输的协议和功能的,它使用的是RPC(RemoteProcedureCall)协议。通过rpcinfo命令可以查看NFS相关的端口:linux@linux-virtual-machine:~$rpcinfo-plocalhostprogramversprotoportservice1000004tcp111portmapper1000003tcp111portmapp

    2022年6月27日
    76

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号