以下測試失敗:爲什麼map()和列表理解的結果是不同的?
#!/usr/bin/env python
def f(*args):
"""
>>> t = 1, -1
>>> f(*map(lambda i: lambda: i, t))
[1, -1]
>>> f(*(lambda: i for i in t)) # -> [-1, -1]
[1, -1]
>>> f(*[lambda: i for i in t]) # -> [-1, -1]
[1, -1]
"""
alist = [a() for a in args]
print(alist)
if __name__ == '__main__':
import doctest; doctest.testmod()
換句話說:
>>> t = 1, -1
>>> args = []
>>> for i in t:
... args.append(lambda: i)
...
>>> map(lambda a: a(), args)
[-1, -1]
>>> args = []
>>> for i in t:
... args.append((lambda i: lambda: i)(i))
...
>>> map(lambda a: a(), args)
[1, -1]
>>> args = []
>>> for i in t:
... args.append(lambda i=i: i)
...
>>> map(lambda a: a(), args)
[1, -1]
對於像我這樣的讀者來說,最初沒有注意到任何問題:注意`[ - 1,-1]`!本質上`lambda i:...`在循環中不捕獲i的當前值。與Python相關的 – 2010-01-07 17:27:13
常見問題解答:[爲什麼使用不同值的循環中定義的lambda都返回相同的結果?](https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined -in-a-loop-with-different-values-all-return-the-same-result) – jfs 2016-10-05 15:11:02