摘要:原文地址首先需要搞清楚兩個(gè)概念賦值和引用,對(duì)于操作賦值操作程序先新建對(duì)象,然后將的值拷貝到中。切片操作屬于淺拷貝。
原文地址
首先需要搞清楚兩個(gè)概念:賦值和引用,對(duì)于操作 target = source:
賦值操作:程序先新建對(duì)象target,然后將source的值拷貝到target中。這里,target和source值相同,但是它們是兩個(gè)完全不同的對(duì)象。
引用操作:程序直接將target指向source,也就是說(shuō)target和source是同一個(gè)對(duì)象,target只不過(guò)是source的一個(gè)別名。
python中沒(méi)有賦值,只有引用。
>>> source = 12 >>> target = source >>> target is source True
如果我們想拷貝一個(gè)對(duì)象,而不僅僅是創(chuàng)建一個(gè)引用,那么該如何操作呢?萬(wàn)能的python提供了兩種拷貝機(jī)制淺拷貝(shallow copy)、深拷貝(deep copy)供我們選擇,淺拷貝和深拷貝的唯一區(qū)別在于對(duì)嵌套對(duì)象的拷貝處理上。
Function | Description |
---|---|
copy.copy(x) | Return a shallow copy of x. |
copy.deepcopy(x) | Return a deep copy of x. |
exception copy.error | Raised for module specific errors. |
對(duì)于嵌套對(duì)象比如說(shuō)source = [1, 2, [3, 4]],淺拷貝創(chuàng)建新的列表對(duì)象target,target中的所有元素均是source中元素的引用,也就是說(shuō)target中的元素只是source中元素的別名。
切片操作[start:end]屬于淺拷貝。
>>> source = [1, 2, [3, 4]] >>> target = source[:] >>> source is target False >>> for i in range(3): ... print source[i] is target[i] ... True True True >>> source[2][2] = "see here" >>> source, target ([1, 2, [3, "see here"]], [1, 2, [3, "see here"]])
圖1. 淺拷貝示意圖
大多時(shí)候有淺拷貝就足夠了,但是某些情況下深拷貝仍有著舉足輕重的作用。
深拷貝,其實(shí)就是遞歸拷貝。也就是說(shuō)對(duì)于嵌套對(duì)象比如說(shuō)source = [1, 2, [3, 4]],深拷貝時(shí)創(chuàng)建新的列表對(duì)象target,然后遞歸地將source中的所有對(duì)象均拷貝到target中。即如果source中的元素是列表、字典等,那么python將拷貝這些列表、字典中的對(duì)象到target中去,就這樣迭代下去,直到不存在嵌套結(jié)構(gòu)。
>>> source = [1, 2, [3, 4]] >>> import copy >>> target = copy.deepcopy(source) >>> target is source False >>> for i in range(3): ... print target[i] is source[i] ... True True False >>> source[2][4] = "see here" >>> source, target ([1, 2, [3, "see here"]], [1, 2, [3, 4]])
圖2. 深拷貝示意圖
深拷貝存在兩個(gè)問(wèn)題:
對(duì)一個(gè)遞歸對(duì)象進(jìn)行深拷貝會(huì)導(dǎo)致遞歸循環(huán)。比如values = [values, 2];
由于深拷貝要拷貝所有對(duì)象,因此有時(shí)候會(huì)拷貝多余的內(nèi)容,比如管理用的數(shù)據(jù)結(jié)構(gòu)應(yīng)該在不同拷貝間共享。
不過(guò)_deepcopy()_函數(shù)提供了兩個(gè)解決方案避免以上問(wèn)題:
拷貝過(guò)程中維護(hù)一個(gè)備忘字典"memo",字典中存放已經(jīng)拷貝過(guò)的對(duì)象;
允許用戶在自定義的類中重寫(xiě)拷貝操作或重寫(xiě)要拷貝的組件。
參考python的賦值操作
Python Copy Through Assignment?
copy module 學(xué)習(xí)筆記
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/45282.html
摘要:前端個(gè)靈魂拷問(wèn),徹底搞明白你就是中級(jí)前端工程師上篇感覺(jué)大家比較喜歡看這種類型的文章,以后會(huì)多一些。所有依賴這個(gè)模塊的語(yǔ)句,都定義在一個(gè)回調(diào)函數(shù)中,等到加載完成之后,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行。此規(guī)范其實(shí)是在推廣過(guò)程中產(chǎn)生的。 showImg(https://segmentfault.com/img/bVbwAMU?w=700&h=394); 前端20個(gè)靈魂拷問(wèn),徹底搞明白你就是中級(jí)前端工程師...
摘要:前端個(gè)靈魂拷問(wèn),徹底搞明白你就是中級(jí)前端工程師上篇感覺(jué)大家比較喜歡看這種類型的文章,以后會(huì)多一些。所有依賴這個(gè)模塊的語(yǔ)句,都定義在一個(gè)回調(diào)函數(shù)中,等到加載完成之后,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行。此規(guī)范其實(shí)是在推廣過(guò)程中產(chǎn)生的。 showImg(https://segmentfault.com/img/bVbwAMU?w=700&h=394); 前端20個(gè)靈魂拷問(wèn),徹底搞明白你就是中級(jí)前端工程師...
摘要:近日,一篇在上成為了網(wǎng)友熱議的話題。在這種結(jié)構(gòu)改變幾個(gè)月后,微軟宣布注資億美元。與微軟的合作關(guān)系是基于一個(gè)重要的前提,即微軟有權(quán)將的部分技術(shù)商業(yè)化。網(wǎng)友紛紛稱早已應(yīng)該更名為。 編譯?| 禾木木 出品 |?AI科技大本營(yíng)(ID:rgznai100) OpenAI 如何以 10 億美元的價(jià)...
摘要:返回一個(gè)對(duì)象先說(shuō)一個(gè)最常用的方法構(gòu)造函數(shù)獲取所有節(jié)點(diǎn)獲取節(jié)點(diǎn)的長(zhǎng)度作用于鏈?zhǔn)秸{(diào)用測(cè)試上面的代碼就可以實(shí)現(xiàn)的效果因?yàn)槲覜](méi)讀過(guò)源碼。 es5版本:(過(guò)兩天寫(xiě)es6 版本的)由淺入深地講,先說(shuō)使用, function person(age, sex) { this.age = age; this.sex = sex; this.clothes ...
閱讀 1335·2021-09-01 10:30
閱讀 2263·2021-07-23 10:38
閱讀 969·2019-08-29 15:06
閱讀 3215·2019-08-29 13:53
閱讀 3325·2019-08-26 11:54
閱讀 1901·2019-08-26 11:38
閱讀 2436·2019-08-26 10:29
閱讀 3190·2019-08-23 18:15