【发布时间】:2018-10-31 15:10:20
【问题描述】:
这是示例 python 代码。
f_list = [lambda x : x ** i for i in range(5)]
[f_list[j](10) for j in range(5)]
我认为输出应该是:
[10, 100, 1000, 10000]
但我得到了这个:
[10000, 10000, 10000, 10000]
我想知道当我运行这段代码时实际发生了什么。以及与惰性求值有什么联系。
【问题讨论】:
-
在某处肯定有重复。简而言之,您的函数不是
i的闭包;f_list中的每个函数都是 exact 相同的函数,其主体引用了一个全局变量i,当函数被调用时会查找其值。 -
结果是[10000, 10000, 10000, 10000, 10000]
-
是的,因为列表中的每个函数在被调用时都会看到
i == 4,因为这是列表理解分配给i的最后一个值。在计算lambda表达式以生成函数时i的值是无关紧要的。 -
对于 Python 3(更正我的原始评论),
i不是全局变量,而是特定于列表理解但由所有函数共享的非局部变量 -
@AndyK 我只是忘记了“0”
标签: python python-3.x lazy-evaluation