Python字典操作开发虚拟咖啡机 资源统计异常问题排查
问题根因
- 报表数据不更新:你在程序初始化时将
resources字典中的原料值赋值给了独立全局变量water/milk/coffee,Python中整数为不可变类型,这步操作是值拷贝,相当于把初始状态的原料数复制了一份单独存储。后续for循环扣减资源时只修改了resources字典内的数值,这三个独立变量从未被同步更新,调用report()时传入的始终是程序启动时的初始值,自然看不到资源变动。 - 资源余量出现负数:如果资源校验逻辑
check_resources读取的是那三个从未更新的独立变量,而非resources字典的实时值,那么无论字典里的实际资源被扣到多少,校验永远会判定“资源充足”,允许扣减逻辑执行,多次下单后字典内的资源值就会被扣成负数。即使你当前贴的代码里check_resources读的是字典,多份数据存储的逻辑本身就有隐患,很容易在后续修改时出现校验读旧值、扣减改新值的问题,导致负数。
修复方案
- 第一步:删除开头定义的三个独立全局变量
water = resources["water"]、milk = resources["milk"]、coffee = resources["coffee"],所有原料数据统一存在resources字典中,只维护一份数据源,从根源避免数据不一致。 - 第二步:修改
report函数,直接读取resources字典的实时值打印,不再依赖外部传入独立原料变量,修改后的代码如下:
def report(money_in_box): print("The coffee machine has:") print(f"Water: {resources['water']}ml") print(f"Milk: {resources['milk']}ml") print(f"Coffee: {resources['coffee']}g") print(f"Money: ${format(money_in_box, '.2f')}")
- 第三步:调整主循环里的report调用逻辑,把原来的
report(water, milk, coffee, money_profit)改为report(money_profit)即可。
修复后验证
修改完成后,每次下单扣减的是resources字典的值,报表读取的也是同一份字典的实时数据,资源校验时也读这份数据,就不会再出现报表不更新、资源扣成负数的问题。
内容的提问来源于stack exchange,提问作者Lebron James
相关产品推荐
相关产品推荐

