我试过这段代码,我不明白它是如何运作的
a=[1,'a',2,'b','test','exam']
for a[-1] in a:
print(a[-1])
输出
1
a
2
b
test
test
答案 0 :(得分:5)
在python中,您可以使用索引-1
隐式访问列表的最后一个元素。因此a[-1]
将返回列表a
的最后一个元素的值。
通过执行for循环for a[-1] in a
,您遍历列表,并将a
的下一个元素的值存储在其最后一个元素中。
因此,为了更好地了解正在发生的事情,您应该在每次迭代时打印整个列表,这样您就可以看到操作:
a=[1, 'a', 2, 'b', 'test', 'exam']
for a[-1] in a:
print(a)
你会得到:
[1, 'a', 2, 'b', 'test', 1]
[1, 'a', 2, 'b', 'test', 'a']
[1, 'a', 2, 'b', 'test', 2]
[1, 'a', 2, 'b', 'test', 'b']
[1, 'a', 2, 'b', 'test', 'test']
[1, 'a', 2, 'b', 'test', 'test']
你可以看到,在每次迭代时,最后一个元素将保存即将发生的元素的值,实际上你将丢失最后一个元素的原始内容,即'exam'
,因为它在每次迭代中都会被覆盖。 / p>
希望现在有意义。
答案 1 :(得分:4)
让我们稍微改变一下循环:
a=[1,'a',2,'b','test','exam']
for temp in a:
a[-1] = temp
print(a[-1])
此循环也是如此。
修改强>
以下是所有迭代:
temp = a[0] => a[-1] is 1 and a is [1,'a',2,'b','test',1]
temp = a[1] => a[-1] is 'a' and a is [1,'a',2,'b','test','a']
temp = a[2] => a[-1] is 2 and a is [1,'a',2,'b','test',2]
temp = a[3] => a[-1] is 'b' and a is [1,'a',2,'b','test','b']
temp = a[4] => a[-1] is 'test' and a is [1,'a',2,'b','test','test']
temp = a[5] => a[-1] is 'test' and a is [1,'a',2,'b','test','test']
专注于最后2次迭代。
答案 2 :(得分:0)
捣乱。由于 for 循环,for a[-1] in a set a[-1] = a[1]。在随后的迭代中,它再次这样做,因此列表的内容循环。当它进行第 6 次迭代时,您可能期望打印是“考试”。但是,请记住第一次迭代中发生的事情。 a[-1] = a[1]。考试字符串不再存在,因为它被整数 1 破坏了。当时,a[1] 和 a[-1] 都是整数 1。
for 循环完成后,退出其作用域。在主程序的范围内,列表 a 的内容从未改变。所以你最后的打印与循环中发生的事情无关。
for 循环接受所有与常规赋值相同的赋值目标,无论多么愚蠢。所以它重复分配到列表的最后一个位置。
你真的不应该在 for ... in 之间使用任何索引。你应该只在那里写一个变量名,不要写任何现有变量的名称。没有人会在实际项目中编写这样的代码,因为不应该像这样使用 for 循环。