zoukankan      html  css  js  c++  java
  • 闭包函数延迟绑定问题

    函数嵌套的时候,如果循环返回一个函数的对象时,函数中出现引用的时候并不会立即引用循环的值,而是运行嵌套函数的时候才会查找引用的值,这个特许就是闭包函数的延迟绑定。
    复制代码
    def multipliers():
            return [lambda x:x*i for i in range(4)] 
            
    print([m(2) for m in multipliers()])
    
    # 答案:
        [6,6,6,6]
    复制代码

    代码相当于

    复制代码
    def multipliers():
        funcs = []
        for i in range(4):
            def bar(x):
                return x*i
            funcs.append(bar)
        return funcs
    print ([m(2) for m in multipliers()] )
    复制代码

    返回的是一个函数对象列表,函数对象在下面的循环打印的时候才会调用i, 所以i的值为3,输出就为[6,6,6,6]

    改进的办法:

    复制代码
    def multipliers():
        funcs = []
        for i in range(4):
            def bar(x,i=i):
                return x*i
            funcs.append(bar)
        return funcs
    print ([m(2) for m in multipliers()] )
    复制代码

    在循环的时候就添加默认值,就会立即调用i的值。

    def multipliers():
        return [lambda x,i=i: x * i for i in range(4)]
    
    
    print([m(2) for m in multipliers()])
  • 相关阅读:
    word查找与替换
    细说ASP.NET Windows身份认证
    防钓鱼代码
    sql触发器
    url地址栏参数
    sql递归查询
    认识TWICImage类
    尝试发个贴
    泛型单元
    [学习官方例子]TArray
  • 原文地址:https://www.cnblogs.com/sewen-H/p/13682350.html
Copyright © 2011-2022 走看看