Python中如何正确向列表添加多个不同字典?
问题解答
你的猜测完全正确
在Python中,字典属于可变对象,当你执行mylist.append(mydict)时,并没有把字典的内容复制一份添加到列表里,而是把字典对象的引用(内存地址)添加到了列表中。也就是说,列表里的两个元素指向的是同一个内存中的字典对象。后续修改mydict的内容时,列表里的元素自然会同步变化——因为它们本质上是同一个东西。
正确添加不同字典的方法
方法1:每次创建全新字典
在每次需要添加新字典到列表前,重新初始化一个空字典,这样每次添加的都是独立的字典对象:
mylist = [] # 第一次构建字典 mydict = {} mydict["s"] = 1 mydict["p"] = "hasprice" mydict["o"] = 3 mylist.append(mydict) # 第二次构建字典,重新创建空字典 mydict = {} mydict["s"] = 22 mydict["p"] = "hasvat" mydict["o"] = 66 mylist.append(mydict) print(mylist)
输出结果:
[{'s': 1, 'p': 'hasprice', 'o': 3}, {'s': 22, 'p': 'hasvat', 'o': 66}]
方法2:添加时复制现有字典(浅拷贝)
如果需要基于已有字典修改后添加,可以用字典的copy()方法(或dict()构造函数)创建副本,这样添加到列表的是新的字典对象:
mydict = {} mylist = [] mydict["s"] = 1 mydict["p"] = "hasprice" mydict["o"] = 3 mylist.append(mydict.copy()) # 添加字典副本 mydict["s"] = 22 mydict["p"] = "hasvat" mydict["o"] = 66 mylist.append(mydict.copy()) # 添加新的副本 print(mylist)
同样能得到包含不同字典的列表。
循环场景下的写法
如果是在循环中批量构建字典,推荐在每次循环内创建新字典,示例如下:
mylist = [] # 假设待处理的参数集合 data_items = [ (1, "hasprice", 3), (22, "hasvat", 66) ] for s_val, p_val, o_val in data_items: new_dict = {} new_dict["s"] = s_val new_dict["p"] = p_val new_dict["o"] = o_val mylist.append(new_dict) # 写入JSON文件 import json with open("output.json", "w") as f: json.dump(mylist, f, indent=4)
循环内的new_dict每次都是独立对象,添加到列表后不会互相影响,最终写入JSON文件的内容也符合预期。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

