小编Kye*_*Shi的帖子

Python`list.extend(iterator)`是否一定是懒惰的?

摘要

假设我有一个iterator当从中消耗元素时执行一些副作用的操作,例如修改列表。如果我定义一个list l和call l.extend(iterator),是否保证在迭代器中的元素被消耗时extend将元素l逐个推入一个元素,而不是保留在缓冲区中然后一次推入所有元素

我的实验

我在计算机上使用Python 3.7进行了快速测试,list.extend基于该测试似乎很懒。(请参见下面的代码。)这是否由规范保证,如果可以,则在规范中提到了什么?

(此外,请随时批评我,并说“这不是Python风格的,您这个傻瓜!”-尽管如果您也想回答我这个问题也回答了我,我将不胜感激。自己的好奇心。)

假设我定义了一个迭代器,该迭代器会在运行时推送到列表中:

l = []

def iterator(k):
  for i in range(5):
    print([j in k for j in range(5)])
    yield i

l.extend(iterator(l))
Run Code Online (Sandbox Code Playgroud)

以下是非延迟(即缓冲)与延迟可能extend实现的示例:

def extend_nonlazy(l, iterator):
  l += list(iterator)

def extend_lazy(l, iterator):
  for i in iterator:
    l.append(i)
Run Code Online (Sandbox Code Playgroud)

结果

这是当我运行的两个已知实现时发生的情况extend


非懒惰:

l = []
extend_nonlazy(l, iterator(l))
Run Code Online (Sandbox Code Playgroud)
# output
[False, False, False, False, False] …
Run Code Online (Sandbox Code Playgroud)

python iterator list lazy-evaluation data-structures

13
推荐指数
2
解决办法
266
查看次数