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
相关产品推荐
相关产品推荐

