我有以下代码:
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):
为什么会这样?
我有以下代码:
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
代码,我们可以凭直觉知道为什么它不再有效.
返回的迭代器基本上需要知道最后一个索引的位置和数组的长度.如果数组的大小改变,迭代器将不再工作.
这也不会产生正确的结果,但迭代器会运行:
s = [1,2,3]
t = reversed(s)
s.append(4)
for i in t:
print(i)
# output: [3, 2, 1]
s = [1,2,3]
t = reversed(s)
s.pop()
s.append(4)
for i in t:
print(i)
# output: [4, 2, 1]
它仍然有效!
所以有一个内部判断,看看最后一个索引是否仍然有效,如果有效,这是一个到索引0的简单for循环.
如果不起作用,迭代器将返回空.