我想用一些不同的默认参数制作一个函数的多个变体,但它根本不起作用。
这是一个简化的例子:
In [1]: def showme(what):
...: print("My number is %d!" % what)
...:
In [2]: showme(99)
My number is 99!
In [3]: fns = []
In [4]: for i in range(0, 10):
fns.append( lambda: showme(2**i) )
In [5]: for fn in fns:
fn()
My number is 512!
My number is 512!
My number is 512!
My number is 512!
My number is 512!
My number is 512!
My number is 512!
My number is 512!
My number is 512!
My number is 512!
In [6]:
我做错了什么,我该如何解决?显然我期待1,2,4,8...
。
在实际代码中,lambda还获得了一些其他参数,而不仅仅是i
。
当我使用硬编码的数字时,它就像魅力一样。
答案 0 :(得分:1)
仅在调用函数时才计算lambda函数内的表达式。这意味着lambda中的i
将引用循环中i
的最后一个值,即512
。
要解决此问题,您可以在每次迭代过程中捕获i
的值,如下所示:
fns.append(lambda i=i: showme(2**i))
演示:
>>> def showme(what):
... print("My number is %d!" % what)
...
>>> fns = []
>>> for i in range(0, 10):
... fns.append(lambda i=i: showme(2**i))
...
>>> for fn in fns:
... fn()
...
My number is 1!
My number is 2!
My number is 4!
My number is 8!
My number is 16!
My number is 32!
My number is 64!
My number is 128!
My number is 256!
My number is 512!
>>>
这是有效的,因为一旦定义了lambda函数就会计算默认参数值。