我有以下代码:

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相关问答推荐

Python根据阈值对数字进行分组

谁能解释一下这个带邮编的多功能环路?

删除浮点型数据集中每列重复值比例超过一定阈值的列

如何使用Selenium从网站下拉菜单中获取值列表?

隐藏Cartopy中高纬度非矩形投影的右侧轴(纬度)标签

使用 multiprocessing 处理图像

使用 pandas 数据帧映射到中转( node )点的跨容量请求

Pandas 值列中列表中元素的计数

机器学习实验笔记本的工作区 url

如何在 VSCode 的在 Cloud Run Emulator 上运行/调试构建设置中添加 SQL 连接

`pyspark mllib` 与 `pyspark ml` 包

Seaborn:注释线性回归方程

smtplib 在 Python 3.1 中发送带有 unicode 字符的邮件的问题

Python 3 list(dictionary.keys()) 引发错误.我究竟做错了什么?

Python中的依赖倒置

IronPython 3 支持?

导入 python 模块而不实际执行它

如何在多核上运行 Keras?

如何在 python 3.x 中禁用 ssl 判断?

用于 unicode 大写单词的 Python 正则表达式