Python循环中修改字符串后索引未更新问题排查求助
问题原因解析
- 第一点:
enumerate(self.seq)在循环启动时就基于初始的self.seq生成了固定的迭代序列,包含初始字符串的所有索引和对应字符。后续你修改self.seq的值,不会更新已经生成的迭代器内容,循环始终会按初始字符串的长度、索引、字符顺序完成遍历,不会响应你对self.seq的修改。 - 第二点:你在循环体内手动修改
num变量的操作完全无效,每次进入下一轮循环时,for语句会自动从迭代器中读取下一组索引和字符,直接覆盖你之前手动修改的num值。
举个实际运行的例子你就能明白:你传入的初始字符串是superman is here,启动循环时enumerate已经生成了从0到15的索引序列,对应初始字符串的每一个字符。当你删掉索引8的第一个空格后,self.seq长度缩短为15,第二个空格的实际索引已经变为10,但迭代器后续还是会按原定顺序输出索引9(对应初始字符i)、10(对应初始字符s)、11(对应初始字符空格),此时你用索引11去取已经变短的self.seq,拿到的已经不是空格,第二个空格就会被漏掉。
修正方案
方案1:直接生成无空格字符串(推荐)
不用遍历修改原序列,直接过滤掉所有空格后赋值即可,逻辑最简单性能也最高:
def remove_space(self): self.seq = ''.join(c for c in self.seq if c != ' ')
方案2:用while循环手动控制索引
如果一定要用动态修改字符串+索引的逻辑实现,就用while循环自己控制索引的增减,避免迭代器固定的问题:
def remove_space(self): num = 0 while num < len(self.seq): if self.seq[num] == ' ': # 删掉空格后索引不递增,下一轮继续检查当前位置的新字符 self.seq = self.seq[:num] + self.seq[num+1:] else: num += 1
内容的提问来源于stack exchange,提问作者Anubrata Das
相关产品推荐
相关产品推荐

