Skip to main content
 首页 » 编程设计

迭代时的Python列表插入

2025年05月04日15zhujiabin

我正在使用 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', ' '] 

通过“向后”迭代,插入不会干扰原始列表元素的原始索引。如果这令人困惑(提示:它是!;-)),只需一次迭代解决它,就像我为您的原始代码拼写出来的那样。