Python列表中字典update()导致所有字典同步更新的问题排查
问题根源:重复引用同一个字典对象
你遇到的问题和update()方法无关,问题出在列表的创建方式上:
当执行test = [{}] * 3时,Python并没有生成3个独立的空字典,而是先创建一个空字典,再让列表的三个元素都指向这个字典的内存地址——说白了,列表里的三个位置存的都是同一个字典的引用。
所以循环里每次调用test[i].update(...),都是在修改同一个字典。循环结束后,列表里的三个元素自然都显示最后一次修改的结果。
解决办法
要创建包含独立字典的列表,用以下两种方式:
方式1:列表推导式(推荐)
test = [{} for _ in range(3)] for i in range(3): test[i].update({'test': i, 'val': i+1}) print(test)
列表推导式会在每次迭代时新建一个空字典,确保每个元素都是独立对象。
方式2:逐个添加字典
test = [] for _ in range(3): test.append({}) for i in range(3): test[i].update({'test': i, 'val': i+1}) print(test)
这种方式也能保证每个字典都是全新的,不会出现引用重复。
验证引用重复的小技巧
用id()函数查看元素的内存地址,就能直观确认:
# 原创建方式的地址(三个完全相同) test = [{}] *3 print(id(test[0]), id(test[1]), id(test[2])) # 列表推导式创建的地址(三个各不相同) test = [{} for _ in range(3)] print(id(test[0]), id(test[1]), id(test[2]))
内容的提问来源于stack exchange,提问作者Mark Wong
相关产品推荐
相关产品推荐

