我有以下代码:

s = [1,2,3]
t = reversed(s)

for i in t:
    print(i)
# output: 3,2,1

如果我从s(原始)中弹出一个元素,那么t(反向)将被清空:

s = [1,2,3]
t = reversed(s)
s.pop()

for i in t:
    print(i)
# expected output: 2, 1
# actual output (nothing): 

为什么会这样?

推荐答案

看看GitHub上的cpython代码,我们可以凭直觉知道为什么它不再有效.

返回的迭代器基本上需要知道最后一个索引的位置和数组的长度.如果数组的大小改变,迭代器将不再工作.

测试1:增加数组长度

这也不会产生正确的结果,但迭代器会运行:

s = [1,2,3]
t = reversed(s)
s.append(4)

for i in t:
    print(i)
# output: [3, 2, 1]

测试2:先减少,然后增加长度

s = [1,2,3]
t = reversed(s)
s.pop()
s.append(4)

for i in t:
    print(i)
# output: [4, 2, 1]

它仍然有效!

所以有一个内部判断,看看最后一个索引是否仍然有效,如果有效,这是一个到索引0的简单for循环.

如果不起作用,迭代器将返回空.

Python-3.x相关问答推荐

如何创建多个日志(log)文件

Numpy将3D数组的每个切片相乘以进行转置并对其求和

PythonPandas READ_EXCEL空数据帧

Pandas 根据条件增加Dataframe列

无法使用xpath关闭selenium中的弹出窗口

通过匹配第一列的行值,逐个单元格地添加两个Pandas 数据框中的浮点数

如何将列表和字典逐行组合在一起

Pandas 窗口聚合两个排序表

过滤并获取数据框中条件之间的行

如果网站加载时间过长,如何强制 Selenium 刷新

Python rolling_corr 取消后,应该用什么方法来处理

如何在带有 GUI 的 python 游戏中设置回答时间限制?

判断是否存在大文件而不下载它

为什么 setattr 在绑定方法上失败

aiohttp+sqlalchemy:在回滚无效事务之前无法重新连接

在python中,如果一个函数没有return语句,它会返回什么?

如何将numpy数组图像转换为字节?

无论如何我可以在 Google colaboratory 中下载文件吗?

当 None 被传递时,如何将默认值应用于 python 数据类字段?

向 Python 函数添加属性的最佳方法