我正在使用python 3.5,并且插入行为不像我期望的那样。
scorelist = ["x","x"]
for q in range(0, len(scorelist)):
if scorelist[q] == "x":
scorelist.insert((q), " ")
我希望保留最少的读数如下
scorelist = ["x", " ", "x", " "]
相反,它留给我
scorelist = [" ", " ", "x", "x"]
我很难过为什么这是输出。任何指导都将不胜感激。
答案 0 :(得分:6)
在迭代任何容器时改变任何容器通常都是一个坏主意。
在您的情况下,在len(scorelist)
循环开始时,for
会被评估一次。那时的长度是2,所以范围只是[0, 1]
。以后什么都不可能改变它。
在第一次迭代中,q
为0,scorelist[0]
为"x"
,所以
scorelist.insert(0, " ")
将scorelist
留作
[" ", "x", "x"]
在第二次迭代中,q
为1,对于scorelist
的新值,scorelist[1]
仍为"x"
,所以
scorelist.insert(1, " ")
将scorelist
留作
[" ", " ", "x", "x"]
然后循环结束。它并没有什么神秘之处,但它也不是很明显 - 这是为什么在迭代容器时改变容器的坏主意; - )< / p>
如果您决定在结尾处插入空白,并在此之前插入每对元素之间,请执行以下一种不明确的方法:
for q in reversed(range(1, len(scorelist) + 1)):
scorelist.insert(q, " ")
然后,例如,如果scorelist
以
['x', 'y', 'z']
该循环将其保留为
['x', ' ', 'y', ' ', 'z', ' ']
通过迭代&#34;向后&#34;,插入不会干扰原始列表元素的原始索引。如果这让人感到困惑(提示:它是!;-)),那么一次只进行一次迭代,就像我为原始代码拼写出来一样。