zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mysql合并数据
    java协变类型返回
    OSI网络七层模型理解
    mysql性能优化学习
    redis lock 和 tryLock 实际使用区别
    多字段关联同一张表
    第一个Mabits程序
    Mybatis使用Map来实现传递多个参数及Mybati实现模糊查询
    使用Mybatis框架的步骤
    sql小技巧
  • 原文地址:https://www.cnblogs.com/yingchen/p/11143030.html
Copyright © 2011-2022 走看看