Python列表删除并在列表上迭代

Python列表删除并在列表上迭代,python,list,iteration,Python,List,Iteration,我不理解Python在以下方面给我的行为: >>> adj = gx.g.neighbors('v') >>> adj ['x', 'w'] >>> gx.d['x'] [13, 14, 'black', 'v'] >>> gx.d['w'] [9, 333, 'black', 'v'] >>> for x in adj: #for every element in t

我不理解Python在以下方面给我的行为:

>>> adj = gx.g.neighbors('v')
>>> adj
['x', 'w']
>>> gx.d['x']
[13, 14, 'black', 'v']
>>> gx.d['w']
[9, 333, 'black', 'v']
>>> for x in adj:                    #for every element in the list
...    print "x", x, gx.d[x]
...    print "color", gx.d[x][2]
...    if gx.d[x][2] != 'white':
...       adj.remove(x)
... 
x x [13, 14, 'black', 'v']
color black
>>> adj
['w']

我不明白的是,为什么循环中似乎只打印元素
'x'
'w'
发生了什么事。算法段的输出应该是一个空列表,因为
adj
的两个元素都是黑色的。

创建一个新列表,而不是删除元素:

new_adj = [x for x in adj if gx.d[x][2] == 'white']

创建一个新列表,而不是删除元素:

new_adj = [x for x in adj if gx.d[x][2] == 'white']

您正在对列表进行迭代,同时从列表中删除元素。这不是一个好主意。我想我以前用Java做过这个?每种语言的静态/动态特性是否有差异?在两种语言中都这样做是不好的。不应该在列表上迭代并同时删除元素的原因是因为您无法控制迭代代码。它希望清单在审查时保持得体。有时你可能会让它起作用,但它总是被认为是不好的做法,难以阅读,难以推理,而且很危险。你在一个列表上迭代,同时从列表中删除元素。这不是一个好主意。我想我以前用Java做过这个?每种语言的静态/动态特性是否有差异?在两种语言中都这样做是不好的。不应该在列表上迭代并同时删除元素的原因是因为您无法控制迭代代码。它希望清单在审查时保持得体。有时你可能会让它发挥作用,但它总是被认为是坏习惯,难以阅读,难以推理,而且很危险。