Python-迭代过程中丢失的列表项

Python-迭代过程中丢失的列表项,python,list,iteration,Python,List,Iteration,我一直在试图弄清楚为什么每次迭代时都会丢失列表中的第二项 def main(): _data = [0,1,3,0,5,5] print(_data) # Convert items in the list into strings for item in _data: item = str(item) print(item) _data.append(item) _data.pop(0) p

我一直在试图弄清楚为什么每次迭代时都会丢失列表中的第二项

def main():
    _data = [0,1,3,0,5,5]
    print(_data)
    # Convert items in the list into strings
    for item in _data:
        item = str(item)
        print(item)
        _data.append(item)
        _data.pop(0)
    print(_data)
main()

在更改正在迭代的对象时,您所能期望的最好结果是意外行为


创建第二个空列表,并将转换为字符串的元素从第一个列表添加到第二个列表中,以避免出现这种情况。

\u data.pop(0)
不会更新数据:迭代器位置中项目的
,这将从
索引
推进到
索引+1
的每一步
\u data.pop(0)
表示所有剩余元素的位置都已从
索引
移动到
索引-1
,因此实际上,以前位于
索引+1
的元素现在位于
索引
,并被跳过。不要同时迭代和删除!你到底想做什么,你可以通过
\u data=list(map(str,\u data))
获得你想要的结果(将项目转换为字符串),或者如果你更喜欢列表理解
\u data=[str(item)for item in \u data]
。这两种方法实际上都是创建一个新列表,而不是就地编辑现有列表,但这通常是这些情况下的最佳实践(您也可以迭代索引值并就地更改元素,但通常不太习惯)。您不需要删除任何内容。如果要就地更新
\u数据
,请使用
\u data[:]=[str(item)for the item in{/code>,或者仅使用
for i,item in enumerate(\u data):\u data[i]=str(item)
@jdehesa分配给索引:无法优化,将创建一个新列表。然后,切片分配不知道只清空当前列表,而是跨引用进行复制(它有一个新列表可供引用并与item count进行比较)。它们根本不需要创建第二个列表,因为它们不需要删除任何内容。他们只是简单地用
str()
转换来替换所有项目,效率非常低(二次时间,将列表长度加倍需要4倍的处理时间)。