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
相关产品推荐
相关产品推荐

