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

Python中列表内字典元素值随循环变化的原因及解决办法

问题原因与解决方法

原因

字典是可变对象,你在循环外只初始化了一个person字典。每次循环里修改的都是同一个字典的内容,然后把这个字典的引用添加到database列表中。也就是说,database里的所有元素其实都指向同一个字典对象。当最后一次循环修改完字典后,列表里所有元素显示的自然都是最后一次修改的结果。

解决方法

有两种常用的解决方式:

方法1:每次循环新建字典

把person = {}放到for row in reader_data循环内部,这样每次循环都会创建一个全新的字典对象,添加到列表里的是不同的对象,互相不会影响。

修改后的代码:

import sys
import csv

with open(sys.argv[1]) as data_file:
    reader_data = csv.reader(data_file)
    headers = next(reader_data)

    database = []

    for row in reader_data:
        person = {}  # 每次循环新建字典
        for i, value in enumerate(row):
            if i == 0:
                person[headers[i]] = value
            else:
                person[headers[i]] = int(value)

        database.append(person)
    print(database)

方法2:追加字典的副本

如果想保留循环外的字典初始化,可以在追加到列表时,使用字典的copy()方法创建一个当前字典的副本,这样列表里存储的是副本的引用,后续修改原字典不会影响已经添加到列表里的内容。

修改后的代码:

import sys
import csv

with open(sys.argv[1]) as data_file:
    reader_data = csv.reader(data_file)
    headers = next(reader_data)

    database = []
    person = {}

    for row in reader_data:
        for i, value in enumerate(row):
            if i == 0:
                person[headers[i]] = value
            else:
                person[headers[i]] = int(value)

        database.append(person.copy())  # 追加字典副本
    print(database)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:42:13