【问题标题】:How to get a closure to refer to the value that a variable had at the time of its definition [duplicate]如何获得闭包以引用变量在定义时所具有的值[重复]
【发布时间】:2012-12-07 01:48:24
【问题描述】:

可能重复:
Creating lambda inside a loop

在下面的代码中,调用返回的闭包数组的任何成员 打印数字 4。

def go():
    x = []
    for i in range(5):
        def y(): print i
        x.append(y)

    return x

我希望闭包的每个成员都打印出 i 在定义闭包时的编号。

【问题讨论】:

    标签: python closures


    【解决方案1】:

    解决此问题的一种方法是使用默认参数:

    def y(i=i): 
        print i
    

    默认参数是在创建函数时评估的,而不是调用函数,所以这可以按您的预期工作。

    >>> i = 1
    >>> def y(i=i): print i
    ... 
    >>> i = 2
    >>> y()
    1
    

    一些额外的信息只是为了好玩:

    如果您对默认值感到好奇,您可以随时使用.func_defaults 属性(python3.x 中的__defaults__)检查:

    >>> y.func_defaults
    (1,)
    

    这个属性也是可写的,所以实际上你可以在创建函数后通过在其中放置一个新元组来更改默认值。

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2019-06-09
      • 2020-03-18
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多