zoukankan      html  css  js  c++  java
  • Python闭包相关问题

    闭包的概念一直是似懂非懂,看过了原理,却不知道怎么实际应用。

    刚好看到Python的late binding问题,记录如下,以备后续增补。

     1 >>> def create_multipliers():
     2 ...     return [lambda x: i*x for i in range(5)]
     3 ... 
     4 >>> for multiplier in create_multipliers():
     5 ...     print multiplier(2)
     6 ... 
     7 8
     8 8
     9 8
    10 8
    11 8
    12 >>> 

    由于Python的迟绑定(late binding)机制,闭包中内部函数的值只有在被调用时才会进行查询,因此create_multipliers函数返回的lambda函数被调用时,会在附近的作用域中查询变量i的值,而在create_multipliers生成返回数组之后,整数i的值是4,不会再改变,因此返回数组中每个匿名函数实际上都是:

    lambda x: 4*x

    解决办法是将临时值也保存在匿名函数的作用域内,在声明匿名函数时就查询变量的值:

     1 >>> def create_multipliers():
     2 ...     return [lambda x, i=i: x*i for i in range(5)]
     3 ... 
     4 >>> for multiplier in create_multipliers():
     5 ...     print multiplier(2)
     6 ... 
     7 0
     8 2
     9 4
    10 6
    11 8
    12 >>> 

    原文链接:http://python.jobbole.com/85354/

    要注意函数的作用域。

  • 相关阅读:
    个人阅读作业
    个人阅读作业3
    阅读作业中软件开发书籍阅读后的一些体会
    个人项目代码复审
    读《移山之道-VSTS软件开发指南》
    北航MOOC客户端
    个人阅读作业3
    个人阅读作业2
    代码互审
    结对编程项目总结以及一些小小的体会
  • 原文地址:https://www.cnblogs.com/harelion/p/5577087.html
Copyright © 2011-2022 走看看