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

首頁 > 編程 > Python > 正文

python中的深拷貝和淺拷貝(讀書筆記)

2019-11-06 06:13:45
字體:
來源:轉載
供稿:網友
python中,對象賦值實際上是簡單的對象引用,也就是說當你創建一個對象,然后把它賦值給另一個變量的時候,python并沒有拷貝這個對象,而是拷貝了這個對象的引用。person = ['name', ['saving', 100.0]] # 建立類型hubby = person[:] # 切片拷貝 wifey = list(person) # 列表工廠方法拷貝[id(x) for x in person, hubby, wifey] # 列表解析出內存中id值 >>> hubby[0] = 'joe'>>> wifey[0] = 'jane'>>> hubby, wifey>>> (['joe', ['saving', 100.0]], ['jane', ['saving', 100.0]])>>> hubby[1][1] = 50.00>>> hubby, wifey>>> (['joe', ['saving', 50.0]], ['jane', ['saving', 50.0]])

問題1 :為什么只設置了joe的值,但是jane的值也跟著變化呢?

原因:因為我們只做了一個淺拷貝,對一個對象進行淺拷貝其實是新創建了一個類型跟原對象一樣,其內容是原來對象元素的 | 引用 | 直白的說就是,新建了一個對象,但是它的內容 | 引用 | 原來的對象。

因為對象jane的內容引用自joe的內容,所以當joe的內容更改時,jane也隨之更改。

序列類型對象的淺拷貝是默認類型拷貝,可以用以下幾種方式實施

完全切片操作利用工廠函數,比如list(), dict()等使用copy模塊的copy函數

問題2: 為什么對設置wifey名字時,hubby的名字沒有改變?

因為在person列表的兩個對象中,第一個是字符串,不可變,第二個是可變的列表,當進行淺拷貝時,字符串被顯式的拷貝,并新創建一個字符串對象,而列表元素,只是把它的引用復制了一下。

改變前

>>> id(x) for x in hubby>>> [4344118896, 4349387912]>>> [id(x) for x in wifey]>>> [4344118896, 4349387912] # 相同

改變后

>>> id(x) for x in hubby>>> [4350395376, 4349387912]>>> id(x) for x in wifey>>> [4350586624, 4349387912] #列表第1個值的id已經不同,說明是另外創建了對象。

要創建分離的對象,需要使用深拷貝

>>> person = ['name', ['saving', 100.0]] >>> hubby = person>>> import copy>>> wifey = copy.deepcopy(person)>>> [id(x) for x in person, hubby, wifey]>>> [4401609544, 4401609544, 4402474376] #可以看到,wifey的id已經不一樣了 >>> hubby[0] = 'joe'>>> wifey[0] = 'jane'>>> hubby,wifey>>> (['joe', ['saving', 100.0]], ['jane', ['saving', 100.0]])>>> hubby[1][1] = 50.00>>> hubby,wifey>>> (['joe', ['saving', 50.0]], ['jane', ['saving', 100.0]]) # 此時,jane的saving不再隨著joe改變 #驗證一下id看是不是真的改變了 >>> [id(x) for x in hubby]>>> [4402580776, 4401564632]>>> [id(x) for x in wifey]>>> [4401200608, 4401248232]#四個對象都是不一樣的了

關于拷貝的警告 1 非容器類型(比如數字,字符串,和其他‘原子’類型的對象沒有拷貝一說,淺拷貝是用完全切片來完成的,第二,如果元組變量,只包含原子類型對象,對它的深拷貝將不會進行,如果把person里第二個元素改成(),即使使用深拷貝也只能得到一個淺拷貝


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盈江县| 射阳县| 饶河县| 读书| 襄垣县| 宜兰县| 肃北| 乐安县| 泾川县| 万载县| 岳西县| 西丰县| 栾川县| 嵩明县| 武威市| 泸水县| 舞钢市| 永德县| 上林县| 延吉市| 寿光市| 无极县| 五指山市| 柳州市| 祥云县| 集贤县| 潜江市| 晴隆县| 丰原市| 宜川县| 玉树县| 天津市| 安义县| 仪征市| 峨山| 萍乡市| 利川市| 封开县| 彰武县| 龙南县| 宝山区|