关于python列表的列表的复制

请看以下两段代码:

第一段:

a = [[1,2,3],[5,6,7]]
b = a[:]
a[0]=8
print(a)
print(b)

结果是:

[8, [5, 6, 7]]
[[1, 2, 3], [5, 6, 7]]

第二段:

a = [[1,2,3],[5,6,7]]
b = a[:]
a[0][1]=8
print(a)
print(b)
print(id(a))
print(id(b))

结果为:

[[1, 8, 3], [5, 6, 7]]
[[1, 8, 3], [5, 6, 7]]
6075528
8860488

显然,第二段代码中,b也得到了硬拷贝,但为何其元素会跟着a变呢?

b = a[:]相当于浅复制,对于列表元素为可变对象的情形,需要使用深复制。下面的代码中deepcopy就是深复制,如果将deepcopy改为copy,效果就会和b = a[:]相同,即浅复制。

>>> import copy
>>> a = [[1,2,3],[5,6,7]]
>>> b = copy.deepcopy(a)
>>> a[0][1] = 8
>>> a
[[1, 8, 3], [5, 6, 7]]
>>> b
[[1, 2, 3], [5, 6, 7]]