【发布时间】:2021-07-16 15:20:21
【问题描述】:
当在 Python 3 中动态嵌套生成器表达式时,当生成器表达式引用动态引用的函数时,我看到了一些非常奇怪的行为,我不知道如何解释。
这是一个非常简化的重现问题的案例:
double = lambda x: x * 2
triple = lambda x: x * 3
processors = [double, triple]
data = range(3)
for proc in processors:
data = (proc(i) for i in data)
result = list(data)
print(result)
assert result == [0, 6, 12]
在这种情况下,我希望每个数字都乘以 6 (triple(double(x))),但实际上调用了 triple(triple(x))。我或多或少清楚,proc 在生成器表达式运行时指向 triple,无论它在生成器表达式创建时指向什么。
那么,(1) 这是预期的吗?有人可以指出 Python 文档中的一些相关信息或其他解释这一点的地方吗?
和 (2) 您能否推荐另一种嵌套生成器表达式的方法,其中每个级别都调用一个动态提供的可调用对象?
编辑:我在 Python 3.8.x 上看到它,还没有用其他版本测试过
【问题讨论】:
-
前两行可能是
def语句,但仍然是单行语句:def double(x): return x * 2(都在一行上)。然后,您将获得具有名称的函数的优势(这有助于解释错误消息),更不用说它只是更惯用的了。 Lambda 用于在您使用它们的地方生成内联函数。如果你将它分配给一个变量,你就是better off making it a proper function definition。 -
@CrazyChucky 好点,完全同意。我只在这个例子中使用了 lambda,我的真实代码使用了实际的命名函数。
标签: python generator-expression