深浅copy
copy就是把一个东西复制过来。由于数据都是存储在内存中,数据之间的复制存在复制后两个变量指向同一个内存地址,如果改变其中一个,另外一个也会作出同样的改变。但是在实际的场景中,我们往往想要对两个相同的数据做不同的处理。
赋值
import copy
a = [1,1,2,3,5,[1,2,3]]
#输出a
[1, 1, 2, 3, 5, [1, 2, 3]]
b = a
#输出,b
[1, 1, 2, 3, 5, [1, 2, 3]]
a.append(3)
#输出a,b
([1, 1, 2, 3, 5, [1, 2, 3], 3], [1, 1, 2, 3, 5, [1, 2, 3], 3])
由上代码可以看出,赋值操作之后,两个变量指向的是一块内存地址,如果其中一个变量作出修改,另一个变量会同样的作出改变。
浅copy
a = [1,1,2,3,5,[1,2,3]]
b = copy.copy(a)
#输出b
[1, 1, 2, 3, 5, [1, 2, 3]]
a.append(3)
#输出a,b
([1, 1, 2, 3, 5, [1, 2, 3], 3, 3], [1, 1, 2, 3, 5, [1, 2, 3]])
print(id(a))
print(id(b))
#输出
2022706578304
2022706553792
a[5][0]=100
#输出a,b
([1, 1, 2, 3, 5, [100, 2, 3], 3, 3], [1, 1, 2, 3, 5, [100, 2, 3]])
a经过浅copy得到b,通过查看内存地址,可以看出a和b的内存id不同,因此a和b是两个不同的变量。在列表的第一层,通过给a增加一个元素,修改a,列表b并没有变化。
但是对于列表的第二层,列表中的列表。我们通过代码发现,修改其中一个,另一个变量中此列表也会作出变化。因此,浅copy仅仅copy了第一层。
深copy
a = [1,1,2,3,5,[1,2,3]]
b = copy.deepcopy(a)
#输出a,b
([1, 1, 2, 3, 5, [1, 2, 3]], [1, 1, 2, 3, 5, [1, 2, 3]])
a.append(3)
#输出a,b
([1, 1, 2, 3, 5, [1, 2, 3], 3], [1, 1, 2, 3, 5, [1, 2, 3]])
a[5][0]=100
#输出a,b
([1, 1, 2, 3, 5, [100, 2, 3], 3], [1, 1, 2, 3, 5, [1, 2, 3]])
print(id(a))
print(id(b))
print(id(a[5]))
print(id(b[5]))
#输出
2022707725888
2022706500352
2022703723200
2022707270912
由上代码可以看出,经过深copy后,两个变量独立互不影响。
如果在一个函数中,我们不但需要返回原数据,还要返回对原数据进行一些操作后的数据,(列表为例)若此数据含有多层我们不能简单的使用赋值或者浅copy来复制数据,可以通过深copy来进行操作。
若原数据只有一层,我们可以使用浅copy来实现。