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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java中父类引用指向子类对象好处

    Java中父类引用指向子类对象好处比如对于 HashMap 与 Map 的理解 HashMap 是 Map 接口的常用实现类 Map 是一个接口 是一个键值对集合 建议使用实现接口的方式使用 Map 如 Map String Object parameters newHashMap lt gt 不建议这样 HashMap String Object parameters newHa String Object String Object

    2025年7月9日
    6
  • CS模型下载_利益相关者模型

    CS模型下载_利益相关者模型当前统计模型,CS模型基于当前统计模型的无迹卡尔曼滤波目标基于当前统计模型的容积卡尔曼滤波目标机动目标跟踪——当前统计模型(CS模型)1.对机动目标跟踪的理解1.1.对机动目标跟踪的理解1.2.目标模型概述2.”当前”统计CS模型3.”当前”统计CS模型3.1.”当前”统计CS模型(连续)3.2.”当前”统计CS模型(离散)3.3.”当前”统计CS模型分析4.”当前”统计CS模型(二维)4.1.”当前”统计CS模型(连续)………………

    2025年12月14日
    3
  • Android service 启动篇之 bindService

    Android service 启动篇之 bindService前言:前面几篇博文Android中service详解Androidservice启动篇之startServiceAndroidservice启动篇之startForegroundService通过sourcecode分析了AMS中service的启动过程,bindService相对复杂一点,主要是多了一些service和app的绑定关系处理。本文继续…

    2022年5月1日
    57
  • MySql必知必会实战练习(四)主键、外键、sql约束、联结表

    本博将对主键、外键、MySql数据库约束和联结表的相关特性进行总结和实战1.主键表中的每一行都应该具有可以唯一标识自己的一列(或一组列),而这个承担标识作用的列称为主键如果没有主键,数据的管理

    2021年12月29日
    44
  • 关于YUV420

    关于YUV和RGB色彩模型一样,YUV也是被发明来描述色彩的模型。类似的还有CMYK等。RGB是使用红绿蓝三原色来描述色彩的模型。YUV使用亮度和色度来描述色彩的模型。CMYK是使用青色Cyan、品红色Magenta、黄色Yellow来描述色彩的模型。Y:表示的是亮度。UV是色差。YUV又称YCbCr,Cb代表蓝色差量(U),Cr代表红色分量(V),Y不仅有绿分量,还叠加了亮度信息。

    2022年4月9日
    42
  • java calendar 设置小时_Java Calendar类的时间操作[通俗易懂]

    java calendar 设置小时_Java Calendar类的时间操作[通俗易懂]JavaCalendar类时间操作,这也许是创建日历和管理最简单的一个方案,示范代码很简单,演示了获取时间,日期时间的累加和累减,以及比较。注意事项:Calendar的month从0开始,也就是全年12个月由0~11进行表示。而Calendar.DAY_OF_WEEK定义和值如下:Calendar.SUNDAY=1Calendar.MONDAY=2Calend…

    2022年4月30日
    210

发表回复

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

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