擅长:python、mysql、java
<p>在这篇文章的底部,列出了一行中正确完成这一点的清单。以下是对这个问题的一些见解。在</p>
<p>不要做这样的事情:</p>
<pre><code>for item in list_:
list_.remove(item)
</code></pre>
<p>因为糟糕和混乱的事情发生了。在</p>
^{pr2}$
<p>每次删除项时,都会更改其余项的索引,这会使循环混乱。在遍历列表时,从列表中删除项的一个好方法是按索引执行,并向后工作,这样删除操作不会影响其余的迭代。这是更好的,因为如果删除第9个元素,那么第8个元素仍然是第8个元素,但是第10个元素将成为第9个元素。如果您已经处理过这个元素,那么您不关心它的索引是什么。在</p>
<pre><code>>>> list_ = range(10)
>>> for i in xrange(len(list_) - 1, -1, -1):
... del list_[i]
...
>>> list_
[]
</code></pre>
<p>或者使用<code>while</code>循环:</p>
<pre><code>i = len(list_)
while i:
i -= 1
del list_[i]
</code></pre>
<p>所以在你的例子中,代码看起来像</p>
<pre><code>users[:] = [user for user in users if specs in BIO[user]['follows']]
</code></pre>
<p>因为这是一个过滤工作,最好是用列表理解来完成的。<code>[:]</code>的要点是它分配给列表的一个片段,而不是删除对列表的引用。这意味着对列表的其他引用都将被更新。它基本上是到位的,只是在覆盖原始列表之前生成了一个拷贝<em>。为了完整起见,下面是如何使用<code>while</code>循环来完成它。在</p>
<pre><code>i = len(users)
while i:
i -= 1
if specs not in BIO[users[i]]['follows']:
del users[i]
</code></pre>
<p>如果你想把它做好,你可以这样做。这里没有名单的副本。在</p>