You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:48:25