在前文已经看到过了可以使用list函数去复制一个列表,这个就是浅复制,浅复制会构建一个新的对象,并且维护之前对象(子对象)的引用,而深复制则是将之前的子对象通过递归的方式也拷贝出来。从例子中学习吧。 先看看浅复制:
a=[[1,2,3],[4,5,6]]
b=list(a)
a is b
Out[20]: False
如果给a再增加一个子列表:
a.append([7,8,9])
a
Out[22]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b
Out[23]: [[1, 2, 3], [4, 5, 6]]
这时候b是不受影响的,但是如果给a的子对象,也就是内部的列表[1,2,3],[4,5,6]进行修改,结果就不一样了。
a[0][1]='x'
a
Out[25]: [[1, 'x', 3], [4, 5, 6], [7, 8, 9]]
b
Out[26]: [[1, 'x', 3], [4, 5, 6]]
我们修改了a,但是b也受到了影响,因为在浅复制里并不会复制a中的子对象,而只是复制了子对象的引用给了b。但是给a增加子对象并不会影响b。为了避免这样的副作用,就有了深复制。深复制在python的内置模块copy。
import copy
a=[[1,2,3],[4,5,6]]
b=copy.deepcopy(a)
这个时候我们修改a,就不会影响b了。
a[0][1]='x'
a
Out[31]: [[1, 'x', 3], [4, 5, 6]]
b
Out[32]: [[1, 2, 3], [4, 5, 6]]
当然这个不仅仅用于copy内置的容器,也用能于copy对象。