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

为何dictionary.get()会触发字典所有条目输出?Python代码问题

问题:Python字典中所有print语句被执行,而非仅匹配key的语句

问题说明

你编写的Python代码意图通过dictionary.get()方法根据匹配的key执行对应print语句,但实际运行时所有字典条目的print语句均被执行,而非仅匹配key的语句。

原代码

miles_between_oil_change = 7500
miles_warning = 500
miles_notify = miles_between_oil_change - miles_warning

def validInput(initial_mileage, final_milege):
    if initial_mileage > final_milege:
        return False
    return True

"""
返回值说明:
    0 - 用户无需更换机油
    1 - 用户需要尽快更换机油
    2 - 用户需要立即更换机油
"""

def userToBeNotified(initial_mileage, final_mileage):
    miles_travelled = final_mileage - initial_mileage
    if miles_travelled < miles_notify:
        return 0
    elif miles_travelled > miles_notify:
        return 2
    else:
        return 1

def readInput():
    previous_mileage = int(input('输入上次换机油时的里程数: '))
    current_milege = int(input('输入当前里程数: '))
    return previous_mileage, current_milege

def main():
    previous_mileage, current_milege = readInput()
    if not validInput(previous_mileage, current_milege):
        print('输入无效 - 当前里程数小于上次换机油时的里程数')
        exit()

    user_notification = userToBeNotified(previous_mileage, current_milege)
    switcher = {
        0: print("用户无需更换机油"),
        1: print("用户需要尽快更换机油"),
        2: print("用户需要立即更换机油"),
    }
    switcher.get(user_notification)

if __name__ == "__main__":
    main()

实际输出

输入上次换机油时的里程数: 5000
输入当前里程数: 13000
用户无需更换机油
用户需要尽快更换机油
用户需要立即更换机油

期望输出

输入上次换机油时的里程数: 5000
输入当前里程数: 13000
用户需要立即更换机油

问题原因

创建switcher字典时,每个key对应的value是print()函数的调用结果,而非可执行的函数或待打印的字符串。Python在定义字典时会立即执行所有print()调用,导致三个语句全部输出。

解决方案

有两种常见修正方式:

方式1:字典存储字符串,获取后再打印

将字典的值改为待打印的字符串,通过switcher.get()拿到对应字符串后,再调用print()输出:

def main():
    previous_mileage, current_milege = readInput()
    if not validInput(previous_mileage, current_milege):
        print('输入无效 - 当前里程数小于上次换机油时的里程数')
        exit()

    user_notification = userToBeNotified(previous_mileage, current_milege)
    switcher = {
        0: "用户无需更换机油",
        1: "用户需要尽快更换机油",
        2: "用户需要立即更换机油",
    }
    print(switcher.get(user_notification))

方式2:字典存储lambda函数,获取后执行

将字典的值改为lambda匿名函数,获取到对应函数后再执行:

def main():
    previous_mileage, current_milege = readInput()
    if not validInput(previous_mileage, current_milege):
        print('输入无效 - 当前里程数小于上次换机油时的里程数')
        exit()

    user_notification = userToBeNotified(previous_mileage, current_milege)
    switcher = {
        0: lambda: print("用户无需更换机油"),
        1: lambda: print("用户需要尽快更换机油"),
        2: lambda: print("用户需要立即更换机油"),
    }
    notify_func = switcher.get(user_notification)
    if notify_func:
        notify_func()

内容的提问来源于stack exchange,提问作者Rahul B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:07:04