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

Python使用switcher实现分支逻辑时私有字典被意外更新问题咨询

问题原因

你对Python用字典模拟switch case的用法存在错误,核心问题是:构造switcher字典时,所有value位置的update()方法会被立即执行,而非等到调用switcher.get()时才执行对应分支。

你写的switcher字典在定义阶段就会依次执行5个车位字典的update()操作,每次调用add_parking_spot()时,所有5类车位的字典都会被写入你传入的{type: slot_no}键值对。你在代码里仅打印了__handicapped_spots,所以看起来只有它被意外更新,实际剩余4类车位的字典也都被写入了相同的内容。

修复方案

要实现匹配到对应车位类型才执行更新的效果,需要把switcher的value改为未执行的可调用对象,匹配成功后再调用执行,修改后的add_parking_spot方法参考如下:

def add_parking_spot(self, spot_type, slot_no):
    # 注意:type是Python内置关键字,不要用作参数名,修改为spot_type避免命名冲突
    switcher = {
        ParkingSpotType.HANDICAPPED: lambda: self.__handicapped_spots.update({spot_type: slot_no}),
        ParkingSpotType.COMPACT: lambda: self.__compact_spots.update({spot_type: slot_no}),
        ParkingSpotType.LARGE: lambda: self.__large_spots.update({spot_type: slot_no}),
        ParkingSpotType.MOTORBIKE: lambda: self.__motorbike_spots.update({spot_type: slot_no}),
        ParkingSpotType.ELECTRIC: lambda: self.__electric_spots.update({spot_type: slot_no}),
    }
    handler = switcher.get(spot_type, None)
    if not handler:
        return 'Wrong parking spot type'
    # 匹配到对应类型后才执行更新操作
    handler()
    print(self.__handicapped_spots)

使用lambda把update操作包裹为匿名函数后,构造switcher时不会立即执行更新逻辑,只有get到对应分支后调用handler()才会执行对应车位字典的更新,就不会出现全量更新的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:15:07