在声明二维列表后,改变列表中的某一元素,发现该列的元素都发生了改变:
a = [[0]*3]*4
print(a)
a[0][0] = 1
print(a)
如代码所示,声明了一个3*4的元素全为0的二维列表,试图改变列表中第一行第一列的元素为1,结果如下:
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
可以发现,二维列表中第一列元素均变为1。
这是Python中的深浅拷贝的原因,声明二维列表时出现了问题,这种声明只是对一维列表[0,0,0]的4次浅拷贝,a = [[0]*3]*4语句对[0]*3复制了4次,对其中一个[0,0,0]改变,剩下的都会发生改变。
查阅资料发现:
list * n -> n shallow copies of list concatenated
n个list的浅拷贝的连接
可以通过深拷贝的方式解决该问题,声明如下:
a = [[0]*3 for i in range(4)]
print(a)
a[0][0] = 1
print(a)
运行结果如下:
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
我是在做力扣97题时遇到的,分享一下:https://leetcode.cn/problems/interleaving-string/description/