深浅copy的区别

浅copy:

  在python中默认做浅copy,浅copy即copy一个外壳其中的id与原对象中的id相同。也就是说除了两对象的id不同,原对象和新对象中的元素的id相同即内存地址相同。所以对原对象中的可变元素的增删改会影响新对象。

import copy
l1 = [1,2,3,[4,]]
l2 = copy.copy(l1)
l1.append(3)

结果:
[1, 2, 3, [4], 3]
140373325285248
[1, 2, 3, [4]]
140373323874464

这里可以看出对原列表进行增删改并不会影响新列表,因为浅copy之后的新列表和原列表的id不同,但是对其中可变的元素进行增删改呢?
import copy
l1 = [1,2,3,[4,]]
l2 = copy.copy(l1)
l1[-1].append(3)
print(l1)
print(id(l1[-1]))
print(l2)
print(id(l2[-1]))

结果:
[1, 2, 3, [4, 3]]
140532222204016
[1, 2, 3, [4, 3]]
140532222204016

这里对原列表中的嵌套列表进行操作可以发现影响了新列表。原因就是因为浅copy仅仅copy了一个新的外壳,外壳中的元素指向的内存地址还是相同的,所以对原列表中的可变的元素进行操作会影响浅copy下来的新列表。

深copy:

  深copy故名思义深度copy,也就是copy了一个完全新的空间存放了一个新的对象。即对于原对象的操作不会影响新对象

import copy
l1 = [1,2,3,[4,]]
l2 = copy.deepcopy(l1)
l1[-1].append(5)

print(l1)
print(id(l1[-1]))
print(l2)
print(id(l2[-1]))

结果:
[1, 2, 3, [4, 5]]
140600086153328
[1, 2, 3, [4]]
140600086153488

深copy即所有内容。包括内部(列表的列表)的所有,形成一个新的对象,虽然与之前的值和内容一模一样,但是它们时完完全全的两个对象,所以不仅a和b的地址不同,可变数据类型的地址同样被拿出来存在新的内存当中,地址同样会不一样,所以做出改变时不会相互影响;其它与浅copy一致,不可变数据类型改变时不会相互影响,且改变后地址会发生改变;

总结:

浅copy仅仅是copy一个外壳也就是模子,模子中所存数据的内存地址都相同所以对原对象的操作会影响新对象。

深copy是完完整整的copy一个新对象,新对象与原对象没有任何关系,不仅是两对象的id不同,对象中的元素的id也不同,所以对原对象的操作不会影响到新对象。

原文地址:https://www.cnblogs.com/Pynu/p/14650416.html