以下 python 代码生成 [(0, 0), (0, 7)...(0, 693)] 而不是预期的元组列表,该列表组合了所有 3 的倍数和 7 的倍数:
multiples_of_3 = (i*3 for i in range(100))
multiples_of_7 = (i*7 for i in range(100))
list((i,j) for i in multiples_of_3 for j in multiples_of_7)
这段代码解决了这个问题:
list((i,j) for i in (i*3 for i in range(100)) for j in (i*7 for i in range(100)))
问题:
- 生成器对象似乎扮演了迭代器的角色,而不是每次要枚举生成的列表时都提供一个迭代器对象。.Net LINQ 查询对象似乎采用了后一种策略。有没有一种优雅的方法来解决这个问题?
- 第二段代码是如何工作的?我应该明白生成器的迭代器在循环完所有 7 的倍数后不会重置吗?
- 你不认为这种行为是反直觉的吗?