直接赋值、浅拷贝和深拷贝

1,概念

直接赋值:直接引用对象。

浅拷贝(copy):简单对象是直接填值,复杂对象是填地址。也可以理解为常量const和可变对象。
改变原对象/拷贝的副本中的“简单对象(const)”,副本/原对象中相应的对象不变;而改变“复杂对象(可变对象)”,相应的对象也会发生改变。

深拷贝(deepcopy):副本与原始对象完全独立。
deepcopy里的所有对象都像copy里的简单对象,怎么改都不变。

例子
image
(来源:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

分析
c这里是copy浅拷贝,简单对象(1,2,3这种)是直接填值,复杂对象(数组)是填地址,所以a中简单对象的值改变时【加入5】c不会随之改变,而a[4]指向的一维数组中的值(复杂对象)改变时【[]中加入c】,c[4]指向的一维数组中的值也随之改变。

deepcopy怎么改都不变。

2,为什么通常“=”是浅拷贝

通常情况下,赋值操作符“=”执行的是浅拷贝,这主要是出于性能和内存管理的考虑。
注意,如果原始对象或其成员变量是可变的,并且在浅拷贝后修改了其中一个对象,那么可能会影响其他对象。在这种情况下,应该使用深拷贝来确保每个对象都有自己的独立副本。

3,为什么我们需要深拷贝

(1)避免对象间相互影响:对一个对象进行修改时,浅拷贝会导致原始对象和拷贝对象的值都发生改变。而深拷贝会创建一个独立的副本,对其进行修改不会影响原始对象的值。
(2)保留对象的不可变性:深拷贝可以创建一个与原始对象具有相同值的不可变对象,防止其被修改。
(3)复制嵌套对象:当对象中包含其他对象时(即为“复杂对象”),浅拷贝只会复制引用(会随原对象的改变而改变),而不会复制嵌套的对象本身(不能够在原对象改变后不变)。深拷贝可以确保嵌套对象也被完全复制。
(4)提高代码的可维护性:深拷贝可以使代码更加可维护。通过明确地复制对象的所有属性,可以更容易地追踪代码中对象的可变性和状态。
注意,深拷贝可能会增加内存和时间的开销,尤其是在处理大型或复杂对象时。因此,在使用深拷贝时,需要权衡复制的需求和性能要求。

发表评论