>>> import copy
>>> origin = [1, 2, [3, 4]]
#origin 里边有三个元素:1, 2,[3, 4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2
True
>>> cop1 is cop2
False
#cop1 和 cop2 看上去相同,但已不再是同一个object
>>> origin[2][0] = "hey!"
>>> origin
[1, 2, ['hey!', 4]]
>>> cop1
[1, 2, ['hey!', 4]]
>>> cop2
[1, 2, [3, 4]]
#把origin内的子list [3, 4] 改掉了一个元素,观察 cop1 和 cop2
可以看出copy对相应对象地址进行引用,而deepcopy则是对象整体的复制。所以修改原数组的时候,copy出来的一起改变,而deepcopy的已经是新的对象了,不发生改变。
>> a = [1, 2, 3]
>>> b = a
>>> a = [4, 5, 6] //赋新的值给 a
>>> a
[4, 5, 6]
>>> b
[1, 2, 3]
# a 的值改变后,b 并没有随着 a 变
>>> a = [1, 2, 3]
>>> b = a
>>> a[0], a[1], a[2] = 4, 5, 6 //改变原来 list 中的元素
>>> a
[4, 5, 6]
>>> b
[4, 5, 6]
# a 的值改变后,b 随着 a 变了
可以看出python中等号=的赋值类似于贴标签的行为:b=a也就是说将b的标签贴到a的位置。当a这个标签又贴到了新的数组时,b并不发生改变。只有对a[0]进行索引访问的时候,才会有变化(a[:] = [4, 5, 6] b也会跟着a改哦)
参考文章:https://blog.csdn.net/qq_32907349/article/details/52190796