首先,了解一下深拷贝和浅拷贝
浅拷贝: 拷贝的是对象的引用,如果原对象改变,相应的拷贝对象也会发生改变。
深拷贝: 拷贝对象中的每个元素,拷贝对象和原有对象不在有关系,两个是独立的对象。
list 封装的 copy 方法实现对列表的浅拷贝
浅拷贝只拷贝一层,具体拿例子说:
In : c =[1,3,5]
In : cc = c.copy()
c 和 cc 分别指向一个不同内存,这样修改 cc 的第一个元素,原来 c 不受影响:
In : cc[0]=10 # 修改cc第一个元素
In : cc
Out: [10, 3, 5]
In : c # 原来 c 不受影响
Out: [1, 3, 5]
但是,如果内嵌一层列表,再使用copy时只拷贝一层:
In : a=[[1,3],[4,2]]
In : ac = a.copy()
In : ac
Out: [[1, 3], [4, 2]]
内嵌的列表并没有实现拷贝。因此再修改内嵌的元素时,原来的列表也会受到影响。
In : ac[0][0]=10
In : ac
Out: [[10, 3], [4, 2]]
In : a
Out: [[10, 3], [4, 2]]
要想实现深度拷贝,需要使用Python模块 copy 中的 deepcopy 方法。
import copy
a = [1, 2, [3, 4]]
# 深拷贝
b = copy.deepcopy(a)
print(a is b)# 因为生成了新的对象所以返回False
a[-1].append(5)
a.append(6)
print(a) # [1, 2, [3, 4, 5], 6]
print(b) # [1, 2, ([3, 4]] 深拷贝后的对象,根本不受原对象的任何影响