我正在使用 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"]
我很困惑为什么这是输出。任何指导将不胜感激。
请您参考如下方法:
在迭代任何容器时改变它通常是一个坏主意。
在您的情况下,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"]
然后循环结束。它并没有什么真正神秘的地方,但也远非显而易见 - 这就是为什么在遍历容器时改变容器是个坏主意 ;-)
编辑:得到你想要的
如果您决定在末尾插入一个空格,并且在此之前的每对元素之间插入一个空格,可以使用以下一种晦涩的方法:
for q in reversed(range(1, len(scorelist) + 1)):
scorelist.insert(q, " ")
然后,例如,如果 scorelist 开始为
['x', 'y', 'z']
那个循环将把它保留为
['x', ' ', 'y', ' ', 'z', ' ']
通过“向后”迭代,插入不会干扰原始列表元素的原始索引。如果这令人困惑(提示:它是!;-)),只需一次迭代解决它,就像我为您的原始代码拼写出来的那样。
