如何修改Python字典中存储的二维列表的指定元素?
问题原因
你遇到的是Python可变对象的引用复用问题:
- 第一次循环向
empty_lists添加元素时,两次追加的都是同一个zero_list对象的引用,所以empty_lists里的两个子列表本质是同一个对象,修改任意一个都会同步到另一个 - 第二次给
cache_memory赋值时,两个key对应的都是同一个empty_lists对象的引用,所以cache_memory[0]和cache_memory[1]完全绑定,修改一处会同步到所有对应位置
解决方法
不需要更换实现方案,只要保证每一层级的列表都是独立的新对象即可,因为你这里子元素都是不可变的字符串,用浅拷贝就能满足需求,修改后代码如下:
cache_memory = {} # 每次调用都生成独立的初始子列表 def generate_zero_list(): return ["0"] * 2 + ["00"] * 5 for index in range(2): # 每个字典key对应独立的二维列表 current_2d_list = [] for _ in range(2): current_2d_list.append(generate_zero_list()) cache_memory[index] = current_2d_list cache_memory[0][0][0] = "1" print(cache_memory)
运行后输出和你预期的结果完全一致。
如果后续你用到的嵌套结构更深、子元素也包含可变对象,可以用copy模块的deepcopy方法生成完全独立的副本:
from copy import deepcopy # 示例:对已有列表做完全拷贝,避免引用绑定 cache_memory[index] = deepcopy(exist_2d_list)
内容的提问来源于stack exchange,提问作者Brian Chen
相关产品推荐
相关产品推荐

