我发现这段代码非常有趣。
a = [0, 1, 2, 3]
for a[-1] in a:
print(a)
输出如下:
[0, 1, 2, 0]
[0, 1, 2, 1]
[0, 1, 2, 2]
[0, 1, 2, 2]
我试图理解为什么 python 会那样做。是因为 python 试图重新使用索引吗? For 循环以某种方式对列表进行切片?
我们可以在迭代列表时添加或删除元素,但是当我们尝试使用索引访问变量时,它会给出奇怪的输出。
谁能帮我理解for循环和列表中索引的交互?或者简单地解释一下这个输出?
最佳答案
它按预期工作。 (至少对于“预期”的某些解释。)
为此重写您的代码,以防止任何时候对 a[-1]
的任何误解:
a = [a for a in range(0,4)]
for b in a:
print (b)
a[-1] = b
print (a)
向我们展示
0
[0, 1, 2, 0]
1
[0, 1, 2, 1]
2
[0, 1, 2, 2]
2
[0, 1, 2, 2]
这清楚地表明 b
赋值 到 a[-1]
是立即完成的,在迭代时更改列表。
四个循环执行以下操作:
a[-1]
被设置为列表的第一个值,0
。结果现在是[0,1,2,0]
。a[-1]
被设置为第二个值,1
。结果是(很明显)[0,1,2,1]
。a[-1]
设置为2
,因此结果为[0,1,2,2]
– 同样,只有a[-1]
被改变了。- 最后,
a[-1]
被设置为a
中的最后一个值,因此实际上它不会改变,最终结果是[0, 1,2,2]
。
关于python:使用列表切片作为for循环的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51460895/