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

Python字典计数场景下if带else与不带else的执行逻辑差异

两段Python列表元素计数代码的差异说明

第二段代码else分支执行逻辑

if...else是Python的互斥条件分支结构,同一轮循环中两个分支只会执行其中一个:

  • 当当前遍历到的食物food不在统计字典dict_food中时,触发if分支:为该食物在字典中创建键值对,设置初始计数为0,本轮循环不会执行计数累加操作
  • 当当前遍历到的食物food已经存在于统计字典中时,才会触发else分支:将该食物对应的计数值加1

运行结果差异的核心原因

两段代码结果完全不同的根源是dict_food[food] += 1(计数累加语句)的缩进位置不同,Python完全依靠缩进区分代码所属的逻辑块,缩进错位直接导致执行逻辑出现本质区别:

  • 第一段代码的计数累加语句和if判断处于同一缩进层级,属于循环内每次必执行的语句,不受if条件约束:

    for food in ['ham','egg','bacon','egg','egg','egg','bacon','bread','bread']:
        if not food in dict_food:
            dict_food[food] = 0
        # 无论是不是首次出现的食物,每轮循环都会执行+1
        dict_food[food] += 1
    

    遍历到首次出现的新食物时,会先通过if分支设置初始值0,紧接着执行累加变成1,不会漏算每一次出现,最终统计结果和真实出现次数一致:ham1次、egg4次、bacon2次、bread2次。

  • 第二段代码的计数累加语句被缩进放在了else分支下,只有满足else的触发条件才会执行:

    for food in ['ham','egg','bacon','egg','egg','egg','bacon','bread','bread']:
        if not food in dict_food:
            dict_food[food] = 0
        else:
            # 只有重复出现的食物才会触发累加,首次出现的计数被漏算
            dict_food[food] += 1
    

    遍历到首次出现的新食物时,仅会设置初始值0,本轮不会执行累加,相当于每类食物的第一次出现都没被统计,最终所有计数值都比真实出现次数少1:ham算成0次、egg算成3次、bacon算成1次、bread算成1次,和实际出现次数不符。

零基础提示:Python没有用大括号区分代码块的语法,缩进是判断代码从属关系的唯一标准,写循环、条件分支时一定要核对缩进位置,避免出现逻辑错误。

内容的提问来源于stack exchange,提问作者12Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:03:23