Python for循环内手动修改计数器symbol递增步长不生效问题
问题根因
Python的for ... in range()是迭代器遍历逻辑,每轮循环都会自动从range生成的序列中取下一个值赋值给循环变量。在循环体内手动修改循环变量的值,仅会生效在当前轮次的代码块内,不会改变迭代器的遍历进度,下一轮循环变量还是会被迭代器重新赋值为序列的下一个值,这就是symbol +=2操作不生效的核心原因。
举个直观例子:当遍历到symbol=0时,即使你手动把symbol改成2,下一轮迭代器还是会取出range序列里排在0后面的1,重新赋值给symbol,之前的加2操作不会对遍历顺序产生任何影响。
实现方法
优先推荐改用while循环手动控制索引步进,逻辑最清晰,不会出现迭代器自动覆盖变量的问题:
def solution(roman): value = 0 symbol = 0 roman_len = len(roman) while symbol < roman_len: # 先做边界校验,避免切片越界 if symbol + 1 < roman_len and roman[symbol:symbol+2] == 'IV': value += 4 symbol += 2 # 匹配到双字符组合,步进2 elif roman[symbol] == 'I': value += 1 symbol += 1 # 匹配单字符,步进1 elif roman[symbol] == 'V': value += 5 symbol += 1 # 其余罗马数字规则(比如IX、XL、CD等特殊双字符组合)可以按照相同逻辑扩展 return value
如果一定要保留for循环的结构,可以加一个跳过标记位实现跳步,不过可读性不如while循环:
def solution(roman): value = 0 skip_flag = False for symbol in range(len(roman)): if skip_flag: skip_flag = False continue if roman[symbol:symbol+2] == 'IV': value += 4 skip_flag = True # 标记下一个索引需要跳过 elif roman[symbol] == 'I': value += 1 elif roman[symbol] == 'V': value += 5 return value
注意事项
- 做双字符切片判断前,一定要先判断
symbol +1 < 字符串长度,否则当索引走到最后一位时,切片虽然不会触发报错,但会出现逻辑误判 - 使用while循环时,所有分支都要明确写清楚索引的步进值,不要漏写导致死循环
内容的提问来源于stack exchange,提问作者BeginnerCode776
相关产品推荐
相关产品推荐

