国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中copy()與deepcopy()的區別小結

2020-02-15 22:39:39
字體:
來源:轉載
供稿:網友

前言

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 的標簽。


第一種情況:

a = [4, 5, 6] 就相當于把 a 標簽從 [1 ,2, 3] 上撕下來,貼到了 [4, 5, 6] 上。

在這個過程中,[1, 2, 3] 這個物品并沒有消失。 b 自始至終都好好的貼在 [1, 2, 3] 上,既然這個 reference 也沒有改變過。 b 的值自然不變。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 濮阳市| 交口县| 开原市| 阜宁县| 迁安市| 高淳县| 敦化市| 城固县| 和林格尔县| 友谊县| 陆丰市| 西宁市| 赤峰市| 延寿县| 新乐市| 洞口县| 仁化县| 集贤县| 闵行区| 德化县| 临桂县| 镇赉县| 张家界市| 醴陵市| 渭南市| 时尚| 二连浩特市| 望江县| 凌云县| 马关县| 泽库县| 大渡口区| 个旧市| 桓台县| 邵武市| 固安县| 鹤峰县| 兰州市| 洪泽县| 南宁市| 临猗县|