Python二维数组更新单个元素致整列变更的原因、解决及Numpy实现
10×10字典矩阵修改异常的原因、解决方法及Numpy实现
原因解析
你写的m = [[{}] * 10]*10存在引用复用问题:
[{}] * 10并没有创建10个独立的空字典,而是生成了10个指向同一个字典对象的引用。- 外层的
*10又把这一行的引用复制了10次,导致整个10×10矩阵里的所有元素,本质上都是同一个字典的引用。 - 所以当你执行
m[0][0] = {"a":1}时,其实是修改了那个唯一的字典实例,所有位置的元素自然都会同步变化。
原生Python解决方法
用嵌套列表推导式,每次循环都新建独立的空字典:
m = [[{} for _ in range(10)] for _ in range(10)]
这样每个{}都是全新的字典对象,修改m[0][0] = {"a":1}时,只会改变对应位置的元素,其他位置仍保持空字典。
Numpy实现方式
如果需要结合Numpy的矩阵操作,可通过指定dtype=object来存储字典对象:
import numpy as np # 创建空的10×10对象矩阵 m = np.empty((10, 10), dtype=object) # 逐个初始化独立的空字典 for i in range(m.shape[0]): for j in range(m.shape[1]): m[i][j] = {}
修改单个元素时,直接通过索引赋值即可,比如m[0, 0] = {"a": 1},这只会改变目标位置的元素。注意:Numpy对非数值型对象的处理没有性能优势,但能兼容Numpy的索引、切片等操作。
内容的提问来源于stack exchange,提问作者Franva
相关产品推荐
相关产品推荐

