【发布时间】:2015-11-07 03:13:19
【问题描述】:
为什么删除列表中的项目会破坏reversed 对象?它不会破坏 gen-exprs,并且追加或修改列表不会破坏 reversed 对象,而且它显然指向原始对象,那么为什么不能给出截断版本呢?也许一些例子可以澄清:
l = [1, 2, 3, 4]
r = reversed(l)
g = (i for i in l)
l.pop() # returns 4
l # returns [1, 2, 3]
for i in g:print(i) # prints 1 2 3 (on separate lines)
for i in r:print(i) # prints ...nothing
r = reverse(l)
g = (i for i in l)
l[1] = 4
for i in g:print(i) # prints 1 4 3 (on separate lines)
for i in r:print(i) # prints 3 4 1 (on separate lines)
r = reversed(l)
g = (i for i in l)
l.append(5)
l # returns [1, 4, 3, 5] just to keep you on your toes
for i in g:print(i) # prints 1 4 3 5 (on separate lines)
for i in r:print(i) # prints 3 4 1 (on separate lines)
所以 - 如果geneexpr 足够聪明,可以指向对象,并且只要响应对象已经改变,为什么reversed 不呢?它显然不会复制,否则它不会在第一种情况下“失败”,也不会在第二种情况下拿起4。所以它必须指向对象。为什么不能从索引-1 开始并向后工作?
【问题讨论】:
-
我很确定当您在迭代器运行时修改可迭代的内容时,Python 迭代器(包括
reversed迭代器)的行为是未指定的,因此您不应该对不同的结果感到惊讶.一些迭代器可能会因错误而停止(字典迭代器会),而其他迭代器可能会提前退出(例如您的问题所涉及的列表反向迭代器),或者跳过或重复元素。
标签: python python-3.x iterator generator reverse