Python修改二维数组元素时整列同步修改的原因及解决方法
异常产生原因
使用dp = [[0] * 3] * 4创建二维数组时出现批量同步修改,核心原因是Python中列表属于可变对象,用乘法复制可变对象时只会复制对象的内存引用,不会生成全新的独立对象:
- 内层的
[0] * 3本身没有问题:整数0是不可变类型,乘法运算会生成3个独立的0值,组成一个独立的行列表[0,0,0] - 外层的
*4操作不会生成4个独立的行列表,只是把同一个[0,0,0]列表的内存地址复制了4份存到外层列表中。也就是说最终得到的dp数组,4行本质指向内存里的同一个列表对象,修改任意一行的元素,实际改动的是这唯一的一个列表,自然所有行的对应位置都会同步变化。
正确创建二维数组的方法
最通用、无副作用的写法是使用列表推导式,循环生成每一行的独立列表:
# 生成4行3列、初始值全为0的二维数组 dp = [[0] * 3 for _ in range(4)] # 测试修改单个元素 dp[1][2] = 10 print(dp)
运行输出符合预期:
[[0, 0, 0], [0, 0, 10], [0, 0, 0], [0, 0, 0]]
如果需要创建维度更大、初始值逻辑更复杂的二维数组,也可以用嵌套循环逐行append生成,本质和列表推导式逻辑一致,核心都是保证每一行都是独立创建的新列表对象,不存在引用复用的问题。
注意:只要是用乘法复制可变对象(列表、字典、自定义类实例等),都会出现引用复用的问题,不止二维数组创建场景,其他场景遇到同类写法也要避开这个坑。
内容的提问来源于stack exchange,提问作者Asmita Poddar
相关产品推荐
相关产品推荐

