zoukankan      html  css  js  c++  java
  • python迟邦定

    1.绑定

        将函数体和函数调用关联起来,就叫绑定

    2.迟绑定

        在程序运行之前(也就是编译和链接时)执行的绑定是早绑定,迟绑定(late binding)是发生在运行时。

    3.实例说明

    def outer():
        return [lambda x: x*i for i in range(3)]
    f1, f2, f3 = outer()
    print f1(1)
    print f2(1)
    print f3(1)
     
    >>> 2
    >>> 2
    >>> 2

    咋一看,上面输出的值貌似和自己想的并不一致,为什么会出现这个问题,这就是python的迟绑定导致的,闭包中的i值只有在调用匿名函数的时候才会去查询,这就导致了当你在调用f1,f2,f3的时候此时i的值已变成2,所以它们的输出结果都是一样的。

    我们再来看看这个问题的变形。

    #情况一
    l = [lambda x: x*i for i in range(3)]
    f1, f2, f3 = l
    print f1(1),f2(1),f3(1)
     
    #情况二
    l = [lambda x: x*i for i in range(3)]
    for f in l:
        print f(1)
     
    #情况三
    l = (lambda x: x*i for i in range(3))
    f1, f2, f3 = l
    print f1(1),f2(1),f3(1)
     
    #情况四
    l = (lambda x: x*i for i in range(3))
    for f in l:
        print f(1)

    情况一:上面这四种情况的输出如下:

    2 2 2

    情况二:
    2
    2
    2

    情况三:
    2 2 2

    情况四:
    0
    1
    2

    对于情况一和情况二,没什么好说的,上面已经说过了,原因在于python的迟绑定。

    但是,为什么会有情况三和情况四这种情形发生呢?

    首先我们应该知道python生成器的表达式,类似于列表推导,只不过是圆括号,

    (lambda x: x*i for i in range(3))其实是一个生成器,我们先说一下为什么情况四和上面三种都不一样,生成器只有在调用next()时才会执行下去,所以在对这个生成器进行for迭代时,迭代一次,i的值变化一次,所以输出结果才会有0,1,2的变化。

    为什么情况三没有这个变化呢?

    l = (lambda x: x*i for i in range(3)),f1, f2, f3 = l,在对f1,f2,f3进行赋值时,已全部迭代完了,此时i的值为2,所以会出现输出值全是2的情况。

  • 相关阅读:
    Hive介绍和Hive环境搭建
    数学【p1658】 购物
    背包【p1858】 多人背包(次优解 or 第k优解)
    Manacher【p4555】 [国家集训队]最长双回文串
    Manacher【p1659】 [国家集训队]拉拉队排练
    数学【p2117】 小z的矩阵
    数学【p2613】 【模板】有理数取余(费马小定理)
    贪心+数学【p3156】 [CQOI2011]分金币 ([HAOI2008]糖果传递)
    线段树【 bzoj3132 】【p4145 】上帝造题的七分钟2 / 花神游历各国
    ST表【p1311】 选择客栈
  • 原文地址:https://www.cnblogs.com/yidashi110/p/10316722.html
Copyright © 2011-2022 走看看