假设我有一个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)