我有以下代码:

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/

10-16 04:31