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

Python字典添加至列表异常:所有条目均为最后输入项的原因排查

问题分析与解决:列表中所有字典条目均为最后一次输入的内容

问题原因

这个问题我太熟啦!本质是Python里可变对象的引用机制搞的鬼~

你看你的代码:

inventory = []
item = {}  # 这里只创建了一个字典对象
def getDetails():
    while True:
        title = input("Enter item name: ")
        if title == 'quit':
            break
        cost = input("Enter item cost: ")
        item['title'] = title
        item['cost'] = cost
        inventory.append(item)  # 每次添加的都是同一个字典的引用
    return inventory

字典是可变对象,你在循环外面只定义了一次item = {},意味着整个程序里只有这一个字典实例。每次循环你只是修改这个字典里的title和cost值,然后把它的引用(不是副本)追加到inventory列表里。列表里存的都是指向同一个字典的指针,当最后一次修改完这个字典后,列表里所有“条目”自然都显示成最后一次的内容了。

修复方案

解决起来超简单:把字典的创建放到循环内部,让每次循环都生成一个全新的字典对象。这样每个条目都是独立的个体,不会互相影响。

修改后的代码如下:

inventory = []
def getDetails():
    while True:
        title = input("Enter item name: ")
        if title == 'quit':
            break
        cost = input("Enter item cost: ")
        item = {}  # 每次循环都创建新的字典
        item['title'] = title
        item['cost'] = cost
        inventory.append(item)
    return inventory

details = getDetails()
print("The dict returned was: ", details)

测试结果

现在再运行代码输入相同的内容:

Enter item name: vacuum cleaner
Enter item cost: 199.95
Enter item name: mug
Enter item cost: 3.95
Enter item name: clock
Enter item cost: 12.95
Enter item name: quit
The dict returned was:  [{'title': 'vacuum cleaner', 'cost': '199.95'}, {'title': 'mug', 'cost': '3.95'}, {'title': 'clock', 'cost': '12.95'}]

完美!每个条目都正确保存了各自的内容~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:38:27