python的深拷贝和浅拷贝

1、浅拷贝

浅拷贝:相当于引用,不开辟新空间。b = a 只是把a的地址复制给了b。

如,赋值。

In [2]: a = [11, 22, 33]
In [3]: b = a
In [4]: b
Out[4]: [11, 22, 33]
In [5]: id(a)
Out[5]: 140117500009736
In [6]: id(b)
Out[6]: 140117500009736
=拷贝地址相同

2、深拷贝

深拷贝:开辟新的内存空间。

深拷贝又有2种:copy()和deepcopy(),都是深拷贝,深度不同。
(1)copy()拷贝是开辟新空间(新地址),但空间里的元素不是新空间(新地址),而是引用(旧地址),引用的好处是占用内存少。简言之,copy()拷贝是对于一个对象的顶层拷贝。
(2)deepcopy()拷贝也是开辟新空间(新地址),并且所有的元素都为全新的空间(新地址),整个全新空间的坏处就是占用内存多。简言之,deepcopy()把a的内容完整的复制了一份。

针对可变变量,深拷贝才有不同效果,如字典、列表。

针对不可变变量,深拷贝和浅拷贝效果是一样的,如int、long、float、tuple元组等。

copy拷贝
In [2]: a = [11, 22, 33]
In [3]: import copy
In [4]: b = copy.copy(a)
In [5]: b
Out[5]: [11, 22, 33]
In [6]: id(a)
Out[6]: 140254995326344
In [7]: id(b)
Out[7]: 140255016303176
copy拷贝开辟浅层空间,但copy用于拷贝元组的时候不会开辟浅层空间,而全都是引用。
In [8]: id(a[0])
Out[8]: 10914688
In [9]: id(b[0])
Out[9]: 10914688
copy拷贝中,元素的地址相同
In [10]: a.append(44)
In [11]: a
Out[11]: [11, 22, 33, 44]
In [12]: b
Out[12]: [11, 22, 33]
添加元素没有相互影响,但修改元素就会相互影响了

deepcopy拷贝
In [2]: a = [11, 22, 33]
In [3]: import copy
In [4]: b = copy.deepcopy(a)
In [5]: b
Out[5]: [11, 22, 33]
In [6]: id(a)
Out[6]: 139826159553800
In [7]: id(b)
Out[7]: 139826159601160
deepcopy开辟整个的全新空间。
添加和修改元素都没有影响。

小结:

=赋值操作:
可变变量的引用会改变
+=修改操作:
可变变量的引用不会改变,但是值会改变。

1、等号赋值,就是将引用给另一个变量,不开辟新的空间。属于浅拷贝。对可变、不可变变量都适用,仅有可变变量有差别效果。
2、深拷贝copy(),就是将表层变量值,复制一份,开辟新的内存空间。属于深拷贝。对可变、不可变变量都适用,仅有可变变量有差别效果。
3、深拷贝deepcopy(),就是整体变量值,赋值一份,开辟新的内存空间。属于深拷贝。对可变、不可变变量都适用,仅有可变变量有差别效果。

原文地址:https://www.cnblogs.com/andy9468/p/13022092.html