Python列表中存放字典遇到的问题

参考文献:https://blog.youkuaiyun.com/qq_29721419/article/details/70310183

试图在列表中存放字典时出了问题

dict1 = {}
list1 = []
for i in range(10):
    dict1['test'] = i
    list1.append(dict1)
print(list1)
# Result : 
[{'test': 9}, {'test': 9}, {'test': 9}, {'test': 9}, {'test': 9}, {'test': 9}, {'test': 9}, {'test': 9}, {'test': 9}, {'test': 9}]

这显然不是预期所要的结果,在优快云查了一下:在使用append方法将字典添加到列表中时,如果改变字典,列表数据也会随之改变,这是因为dict在Python里是object,不属于primitive type(即int、float、string、None、bool)。这意味着你一般操控的是一个指向object(对象)的指针,而非object本身。下面是改善方法:使用copy()

dict1 = {}
list1 = []
for i in range(10):
    dict1['test'] = i
    list1.append(dict1.copy())
print(list1)
# Result:
[{'test': 0}, {'test': 1}, {'test': 2}, {'test': 3}, {'test': 4}, {'test': 5}, {'test': 6}, {'test': 7}, {'test': 8}, {'test': 9}]
### Python 中操作和管理多个字典 #### 合并多个字典 当需要合并两个或更多字典时,可以使用多种方法来完成此操作。对于Python 3.5及以上版本,最简洁的方式之一是利用解包运算符`{**dict1, **dict2}`[^1]。 ```python dict_a = {'a': 1, 'b': 2} dict_b = {'c': 3, 'd': 4} merged_dict = {**dict_a, **dict_b} # 结果为{'a': 1, 'b': 2, 'c': 3, 'd': 4} ``` #### 获取多个字典中的共同键 为了找出几个不同字典之间的共有键,可以通过映射这些字典到它们各自的键列表并将结果转换成集合来进行交集计算[^5]。 ```python from functools import reduce def common_keys(*args): sets_of_keys = [set(d.keys()) for d in args] intersection = reduce(lambda x, y: x & y, sets_of_keys) return list(intersection) a1 = {"name": "Alice", "age": 28, "city": "New York"} a2 = {"name": "Bob", "job": "Engineer", "city": "San Francisco"} common_key_list = common_keys(a1, a2) # 输出 ['name', 'city'] ``` #### 多线程环境中访问共享字典的安全性 在多线程环境下工作时,尽管CPython解释器内部存在全局解释器锁(GIL),这使得同一时刻只有一个线程能够执行Python字节码,从而保证了基本的数据结构如内置字典的操作安全性[^2]。然而,在实际应用开发过程中仍需谨慎对待可能发生的竞态条件等问题,并考虑采用更高级别的同步机制(比如Lock对象)以确保程序逻辑正确无误。 #### 将字典保存至文件以及从文件加载字典 有时会遇到这样的需求——把内存里的字典持久化存放到磁盘上的某个位置以便后续读取使用。此时可以选择JSON格式作为媒介,因为其易于解析而且广泛支持各种编程语言之间交换数据[^3]。 ```python import json data_to_save = { "employees": [ {"firstName": "John", "lastName": "Doe"}, {"firstName": "Anna", "lastName": "Smith"}, {"firstName": "Peter", "lastName": "Jones"} ] } with open('output.json', mode='w') as f: json.dump(data_to_save, f) # 加载已保存的json文件回字典 with open('output.json', mode='r') as f: loaded_data = json.load(f) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值