python - 为什么从原始列表弹出会导致反转的(原始列表)为空?

标签 python python-3.x

我有以下代码:

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。
如果不起作用,则迭代器返回空。

关于python - 为什么从原始列表弹出会导致反转的(原始列表)为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65557061/

相关文章:

python - Python的max函数有多高效

python - 是否可以嵌套所有功能?

python迷宫递归不递归

python - 为什么分号在 IPython 中返回一个空字符串?

python - 如何在Python3中将异步生成器流转换为类似文件的对象?

python - 在 numpy 中提取和转换数据

python - 在 Web 应用程序中使用 Python 语言环境或同等语言环境?

python - 填充\和或任何字符到字符串的最佳方法是什么?

html - 使用 bs4 查找和删除 HTML5 data-* 属性

python - 如何在一串扑克排名中找到最大值