Python 追加并生成列表

标签 python generator

这是怎么回事?为什么 list(f(seq)) 返回的不是 f 生成的元素列表?

>>> def f(seq):
...   a = []
...   for i in seq:
...     yield a
...     a.append(i)
...
>>> f([1,2,3])
<generator object f at 0x1066c7aa0>
>>> b = f([1,2,3])
>>> b.next()
[]
>>> b.next()
[1]
>>> b.next()
[1, 2]
>>> b.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> list(f([1,2,3]))
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

最佳答案

您已经在函数内生成了对列表 a 的完整引用。当 list(f([1,2,3])) 被调用时,结果就是 [a, a, a] 的最终形式a[1, 2, 3]

如果您保存了 f.next() 调用的所有结果,这并没有什么不同。

>>> v1 = b.next()
>>> v2 = b.next()
>>> v1
[1]
>>> v2
[1]
>>> v3 = b.next()
>>> v4 = b.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> v1
[1, 2, 3]

同样,这是正确的,因为生成了 a 并且是对函数 f 中相同内部列表的相同引用。

关于Python 追加并生成列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32514807/

相关文章:

python - 如何提取适合粗线轮廓中间的线方程

Javascript 生成器 throw() 方法推进迭代器?

javascript - 退出前等待KOAJS中的createWriteStream

python - 在Python中跳过yield

python - 如果没有数据,不要用 csv DictWriter 写入文件

python - 如何优化这个MapReduce函数,Python,mrjob

python - 根据列的值从数据框中删除行

python - wxpython 构建器类似于 boa 构造器

python - 如何在生成器中使用 python 上下文管理器

python - 如何使用 split 函数或 Python 中更通用的方式将带有 xml 标签的字符串转换为字典?