Python遍历列表打印库存时末尾异常输出None问题排查
问题原因
末尾输出None来自Python的默认函数行为,同时代码里还存在一个隐藏逻辑bug:
- 核心诱因:Python中如果函数没有写显式的
return语句,执行完后会默认返回None。你调用find_invontory()的时候用了print(find_invontory())的写法,函数内部已经实现了所有库存内容的打印逻辑,外层的print会把函数默认返回的None额外打印一次,就会在所有库存内容的最后多出一行None。 - 隐藏bug:
store_items列表里包含Fort、Turret、Bomb Shelter三个防御建筑项,但collection()函数的分支判断里没有写这三个项对应的取值规则,调用到这三个项时函数也会默认返回None,不修复的话这三个建筑的持有数量会显示为None。 - 额外提示:代码里存在多处拼写错误,比如
invontory应为inventory、Missle应为Missile、BUILINGS应为BUILDINGS,不影响运行但会提升后续维护的出错概率。
修复方案
- 调整函数调用方式:去掉包裹
find_invontory()的print(),直接调用函数即可:# 错误写法 # print(find_invontory()) # 正确写法 find_invontory() - 补全
collection()函数缺失的分支,建议增加兜底返回避免后续漏写分支:def collection(var_needed): if var_needed == "get_items_bought": return total_items_bought elif var_needed == "get_money_spent": return money_spent elif var_needed == "get_Infantry": return infantry elif var_needed == "get_Tank": return tanks elif var_needed == "get_Aircraft": return air_craft elif var_needed == "get_Atomic Missle": return AM elif var_needed == "get_Hydrogen Missle": return HM elif var_needed == "get_Defence Garrison": return defence_troops elif var_needed == "get_Land Mines": return land_mines elif var_needed == "get_Anti Aircraft": return anti_aircraft elif var_needed == "get_Laser Cannon": return Lcannons elif var_needed == "get_Walls": return 1 if walls else 0 elif var_needed == "get_Fort": return 1 if fort else 0 elif var_needed == "get_Turret": return 1 if turret else 0 elif var_needed == "get_Bomb Shelter": return 1 if bomb_shelter else 0 # 兜底返回,避免遗漏分支返回None return 0 - (可选优化)把
find_invontory()里写死列表索引的标题判断改成集合判断,避免后续增减物品时数错索引:# 把分类标题、分隔线统一存在集合里 skip_get_value = {"ATTACK UNITS", "DEFENCE UNITS", "DEFENCE BUILINGS", "-----------------"} for item in store_items: if item in skip_get_value: invontory_lines.append(item) else: # 原有拼接行的逻辑保持不变 sps = "" CCmd = "get_" + item IG = collection(CCmd) number = len(item) while number < 19: sps += " " number += 1 invontory_lines.append(item + ":" + sps + str(IG))
内容的提问来源于stack exchange,提问作者user19355475
相关产品推荐
相关产品推荐

