python中中copy()与与deepcopy()的区别小结的区别小结
前言前言
copy()与deepcopy()之间的区分必须要涉及到python对于数据的存储方式。
深复制被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影
响。
浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数
据块就会发生变化,另一个标签也会随之改变。
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]]
可以看到 cop1,也就是 copy 跟着 origin 改变了。而 cop2 ,也就是 deep copy 并没有变。
Python存储方式存储方式
Python 存储变量的方法跟其他 OOP 语言不同。它与其说是把值赋给变量,不如说是给变量建立了一个到具体值的
reference。
当在 Python 中 a = something 应该理解为给 something 贴上了一个标签 a。当再赋值给 a 的时候,就好象把 a 这个标签从原
来的 something 上拿下来,贴到其他对象上,建立新的 reference。 这就解释了一些 Python 中可能遇到的诡异情况:
>> 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 变了
上面两段代码中,a 的值都发生了变化。区别在于,第一段代码中是直接赋给了 a 新的值(从 [1, 2, 3] 变为 [4, 5, 6]);而第
二段则是把 list 中每个元素分别改变。
而对 b 的影响则是不同的,一个没有让 b 的值发生改变,另一个变了。怎么用上边的道理来解释这个诡异的不同呢?
首次把 [1, 2, 3] 看成一个物品。a = [1, 2, 3] 就相当于给这个物品上贴上 a 这个标签。而 b = a 就是给这个物品又贴上了一个 b
的标签。