为什么生成器列表只返回最后一个生成器的元素?

卢卡斯·施梅尔采森

我得到了一个任意的对象列表(例如['foo', 'bar'])。我的目标是生成一个大小相等的列表,其中结果列表中的每个元素都是一个将相应输入元素重复 5 次的生成器。

这是我真正想做的事情的一个很大的简化,我知道有很多方法可以解决这个任务。但是,我在如何解决这个问题时偶然发现了一些我无法解释的奇怪行为。

这是我对上述任务的解决方案:

my_iterators = [
    (element for _ in range(5))
    for element in ["foo", "bar"]
]
for my_iterator in my_iterators:
    print(list(my_iterator))

我现在预计输出为:

['foo', 'foo', 'foo', 'foo', 'foo']
['bar', 'bar', 'bar', 'bar', 'bar']

然而,令我惊讶的是,它是:

['bar', 'bar', 'bar', 'bar', 'bar']
['bar', 'bar', 'bar', 'bar', 'bar']

为什么它(element for _ in range(5))似乎是 input_list 中最后一个元素的迭代器,而不管它在上下文中的实际内容for element in ["foo", "bar"]我需要如何调整我的代码以产生我最初的目标?

卢卡斯·施梅尔采森

正如 jonsharpe 和 David Buck 在评论中指出的那样,实际上导致这里出现非直观行为的是Python 的后期绑定

似乎有多种方法可以修复已发布的代码,其中一种是:

def make_iterator(element):
    return (element for _ in range(5))

my_iterators = [
    make_iterator(element)
    for element in ["foo", "bar"]
]
for my_iterator in my_iterators:
    print(list(my_iterator))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何编写一个生成器类?

创建一个生成器,该生成器从任意数量的内部生成器中产生值

enumerate()是否产生一个生成器对象?

enumerate()-在Python中生成一个生成器

给定N个生成器,是否可以创建一个在并行过程中运行它们并生成这些生成器的zip的生成器?

如何传递一个空的生成器参数?

为什么生成器没有返回任何值?

返回“生成器对象...”的列表理解

用生成器创建一个dask包

Python:为什么一个生成器内部比其他生成器快?

创建基于类的生成器时,为什么必须调用下一个生成器?

为什么这种理解会返回生成器?

os.walk返回一个生成器对象。我究竟做错了什么?

将多个无限生成器对象组合到一个生成器中

列表生成器:如何使第一个元素与众不同?

生成器为什么不返回以下值?

加入生成器列表的元素

为什么生成器只通过for循环前进一次?

当可调用对象是生成器时,为什么iter(v,w)返回一个类?

如何构建一个简单的令牌生成器

Python生成器返回最后一个项目

需要一个简单的线梯度生成器

无法返回生成器实例。为什么?

为什么生成器是详尽无遗的,而列表/元组不是?

为什么列表理解元素与生成器元素不同,在 Pycharm iPython 提示中?

使用另一个生成器的生成器理解

Python 从生成器项中获取最后一个元素

批量生成器函數在轉換為列表時只返回最後一個元素

给定一个矩阵,返回所有成对邻居的列表(或生成器)