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/

    要注意函数的作用域。

  • 相关阅读:
    微博回调接口
    vue获取微博授权URL
    生成微博授权url接口
    微博账号注册
    电脑程式直接打开文件
    关于 transparent rgba display:none; opacity visiblity 关于em
    定位及部分属性
    盒模型以及部分小笔记
    htm基础知识,css的链入以及标签分类。
    JS函数01
  • 原文地址:https://www.cnblogs.com/harelion/p/5577087.html
Copyright © 2011-2022 走看看