为什么处理NLTK停用词的for循环无限循环,普通遍历却不会?
无限循环问题原因解析
核心原理
Python 使用for循环遍历列表这类可变序列时,会维护一个隐式的递增索引:每轮循环按当前索引取列表元素,索引自动加1,直到索引值大于等于列表当前的总长度时,循环才会终止。
第一段代码无限循环的原因
两个关联错误共同导致了无限循环:
- 遍历的目标列表
word_tok和你追加元素的列表是同一个对象,每次命中「非停用词」条件时,word_tok.append(i)会给原列表末尾新增元素,导致列表总长度持续变大 - 你追加的元素都是满足
i not in stopWords的非停用词,后续遍历到这些新追加的元素时,会再次触发追加逻辑,循环永远无法触发终止条件
第二段代码正常运行的原因
第二段代码仅遍历读取word_tok的元素,全程没有修改word_tok的长度,当隐式索引走到列表初始长度的位置时,循环就会正常结束,自然不会出现无限循环问题。
正确的筛选写法
你原本的需求是把非停用词存入wordClear列表,只需要修改追加的目标列表即可:
wordClear=[] for i in word_tok: if i not in stopWords: # 把元素追加到结果列表,不是原来的分词列表 wordClear.append(i)
内容的提问来源于stack exchange,提问作者nem0
相关产品推荐
相关产品推荐

