• python闭包和延迟绑定


    一、什么是闭包:

    1、函数内定义函数。

    2、外函数的返回时内函数的引用。

    3、内函数使用外函数的局部变量(至少一个)。

    1 def outfunc():
    2     for num in range(4):
    3         def infunc():
    4             return num*2
    5     return infunc
    复制代码
    1 #测试代码:
    2 def outfunc():
    3     for num in range(4):
    4         def infunc():
    5             return num*2
    6     return infunc
    7 
    8 test = outfunc()
    9 print test()
    复制代码

    结果后面解释。

    二、闭包的好处:

    1、避免使用全局变量

    2、可以提供部分数据的隐藏

    3、可以提供更优雅的面向对象实现

    三、闭包中的延迟绑定:

      延迟绑定看起来是一个现象但不是本质。举个例子当内函数引用外函数的一个局部变量,但是局部变量是循环的,那么最后内部引用的这个变量其实对于内函数来说是一个全局变量,所以每一次调用,其实内部使用的这个变量都是循环的最后一个值,而不是每次生成一个调用。其实不止循环,对变量修改也是一样的。所以很多人理解延迟绑定,最后一个才绑定。而本质上是不对的。

      来解释一下,内函数绑定的不是外函数的变量的值,而是地址空间,在外部函数返回以后发现返回的是内函数,这个自己的局部变量还在使用,不会清空这个地址区域而是保存这个地址区域,此时,这个地址空的值是最后一次修改这个变量之后的值,对于循环来说就是最后一个的值。

    复制代码
    1 def outfunc():
    2     temp = [lambda : id(num) for num in range(4) ]
    3     return temp
    4 
    5 for item in outfunc():
    6     print item()
    复制代码

    测试结果

    所以也就很好解释了一中的结果等于6

  • 相关阅读:
    mysql导出存储过程、函数、视图、触发器
    通过mk-table-checksum与pt-table-sync检查不同库两张表的一致性。
    Linux内核OOM机制的详细分析
    Linux虚拟内存(VM)相关参数解析
    mysqld异常重启后,自动启动应用srm进程
    利用python多线程执行远程linux上命令
    oracle数据库时常用的操作命令
    Oralce_DDL
    Oralce_PL_SQL
    mysqlbackup备份和还原
  • 原文地址:https://www.cnblogs.com/yuzhanhong/p/9165600.html
Copyright © 2020-2023  润新知