我有以下代码:
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/