<p>你的测试没什么用。在</p>
<p>确定<code>if not tweetsplit:</code>检查<code>tweetsplit</code>是否为空。但是它不检查<code>tweetsplit</code>是否至少是<code>i+1</code>个元素的长度。在</p>
<p>而且,因为您在循环的中间从<code>tweetsplit</code>中删除,如果您删除哪怕一个元素,那么到最后,它将比<code>i+1</code>短,并引发一个{<cd7>}。在</p>
<p>这就是在循环任何集合的过程中不应该删除或插入的原因之一。(但不是唯一一个,例如,当您删除元素<code>i</code>时,它会将所有其他元素向上移动一个插槽,然后检查新元素<code>i+1</code>,它原来是<code>i+2</code>……这意味着您错过了一个。)</p>
<hr/>
<p>如果你想建立一个符合某些规则的所有tweet的集合,那么通过构建一个新列表来实现这一点要容易得多:</p>
<pre><code>goodTweets = []
for tweet in tweetSplit:
if tweet[:1] != '@':
goodTweets.append(tweet)
</code></pre>
<p>或者:</p>
^{pr2}$
<hr/>
<p>如果因为某种原因确实需要对<code>tweetSplit</code>进行变异,可以使用一些技巧,但是它们都有点难看。在</p>
<p>构建一个新列表,然后将<code>tweetSplit</code>更改为该列表:</p>
^{3}$
<p>或者,在不显式构建新列表的情况下执行此操作:</p>
<pre><code>tweetSplit[:] = (tweet for tweet in tweetSplit if tweet[:1] != '@')
</code></pre>
<p>或者向后迭代。虽然<code>len(tweetSplit)</code>可能会随着删除而更改,但0永远不会更改。(虽然<code>i:</code>中的任何东西的位置都可能改变,<code>:i</code>的位置永远不会改变。)</p>
<pre><code>for i in range(len(tweetSplit))[::-1]:
if tweetSplit[i][:1] == '@':
del tweetSplit[i]
</code></pre>
<p>但是,如果您试图将此作为性能优化进行到位,那么所有这些通常都会比较慢。唯一可能更快的方法是:</p>
<pre><code>i = 0
while i < len(tweetSplit):
if tweetSplit[i][:1] == '@':
tweetSplit[i] = tweetSplit[-1]
tweetSplit.pop()
else:
i += 1
</code></pre>