• 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

  • 相关阅读:
    第五周学习总结-20175218
    第一周测试总结分析
    第四周学习总结-20175218
    第三周学习总结-20175218
    第二周学习任务-20175218
    第一周学习总结-20175218
    20175213 2018-2019-2 《Java程序设计》第11周学习总结
    数据结构-排序(选做)
    20175213 2018-2019-2 《Java程序设计》第10周学习总结
    2018-2019-2 20175213实验三《敏捷开发与XP实践》实验报告
  • 原文地址:https://www.cnblogs.com/yingchen/p/11143030.html
Copyright © 2020-2023  润新知