成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

操作之靈魂——拷貝

codercao / 3048人閱讀

摘要:原文地址首先需要搞清楚兩個概念賦值和引用,對于操作賦值操作程序先新建對象,然后將的值拷貝到中。切片操作屬于淺拷貝。

原文地址

首先需要搞清楚兩個概念:賦值引用,對于操作 target = source:

賦值操作:程序先新建對象target,然后將source的值拷貝到target中。這里,target和source值相同,但是它們是兩個完全不同的對象。

引用操作:程序直接將target指向source,也就是說target和source是同一個對象,target只不過是source的一個別名。

python中沒有賦值,只有引用。

>>> source = 12
>>> target = source
>>> target is source
True

如果我們想拷貝一個對象,而不僅僅是創(chuàng)建一個引用,那么該如何操作呢?萬能的python提供了兩種拷貝機(jī)制淺拷貝(shallow copy)、深拷貝(deep copy)供我們選擇,淺拷貝和深拷貝的唯一區(qū)別在于對嵌套對象的拷貝處理上。

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.
簡單引用:淺拷貝

對于嵌套對象比如說source = [1, 2, [3, 4]],淺拷貝創(chuàng)建新的列表對象target,target中的所有元素均是source中元素的引用,也就是說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í)就是遞歸拷貝。也就是說對于嵌套對象比如說source = [1, 2, [3, 4]],深拷貝時創(chuàng)建新的列表對象target,然后遞歸地將source中的所有對象均拷貝到target中。即如果source中的元素是列表、字典等,那么python將拷貝這些列表、字典中的對象到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. 深拷貝示意圖


深拷貝存在兩個問題:

對一個遞歸對象進(jìn)行深拷貝會導(dǎo)致遞歸循環(huán)。比如values = [values, 2];

由于深拷貝要拷貝所有對象,因此有時候會拷貝多余的內(nèi)容,比如管理用的數(shù)據(jù)結(jié)構(gòu)應(yīng)該在不同拷貝間共享。

不過_deepcopy()_函數(shù)提供了兩個解決方案避免以上問題:

拷貝過程中維護(hù)一個備忘字典"memo",字典中存放已經(jīng)拷貝過的對象;

允許用戶在自定義的類中重寫拷貝操作或重寫要拷貝的組件。

參考

python的賦值操作
Python Copy Through Assignment?
copy module 學(xué)習(xí)筆記

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45282.html

相關(guān)文章

  • 前端20個靈魂拷問 徹底搞明白你就是中級前端工程師 【中篇】

    摘要:前端個靈魂拷問,徹底搞明白你就是中級前端工程師上篇感覺大家比較喜歡看這種類型的文章,以后會多一些。所有依賴這個模塊的語句,都定義在一個回調(diào)函數(shù)中,等到加載完成之后,這個回調(diào)函數(shù)才會運(yùn)行。此規(guī)范其實(shí)是在推廣過程中產(chǎn)生的。 showImg(https://segmentfault.com/img/bVbwAMU?w=700&h=394); 前端20個靈魂拷問,徹底搞明白你就是中級前端工程師...

    MartinDai 評論0 收藏0
  • 前端20個靈魂拷問 徹底搞明白你就是中級前端工程師 【中篇】

    摘要:前端個靈魂拷問,徹底搞明白你就是中級前端工程師上篇感覺大家比較喜歡看這種類型的文章,以后會多一些。所有依賴這個模塊的語句,都定義在一個回調(diào)函數(shù)中,等到加載完成之后,這個回調(diào)函數(shù)才會運(yùn)行。此規(guī)范其實(shí)是在推廣過程中產(chǎn)生的。 showImg(https://segmentfault.com/img/bVbwAMU?w=700&h=394); 前端20個靈魂拷問,徹底搞明白你就是中級前端工程師...

    coolpail 評論0 收藏0
  • OpenAI 以 10 億美元出售「靈魂」,網(wǎng)友熱評不再「Open」

    摘要:近日,一篇在上成為了網(wǎng)友熱議的話題。在這種結(jié)構(gòu)改變幾個月后,微軟宣布注資億美元。與微軟的合作關(guān)系是基于一個重要的前提,即微軟有權(quán)將的部分技術(shù)商業(yè)化。網(wǎng)友紛紛稱早已應(yīng)該更名為。 編譯?| 禾木木 出品 |?AI科技大本營(ID:rgznai100) OpenAI 如何以 10 億美元的價...

    wenzi 評論0 收藏0
  • 深度剖析js原型及面向?qū)ο?/b>

    摘要:返回一個對象先說一個最常用的方法構(gòu)造函數(shù)獲取所有節(jié)點(diǎn)獲取節(jié)點(diǎn)的長度作用于鏈?zhǔn)秸{(diào)用測試上面的代碼就可以實(shí)現(xiàn)的效果因?yàn)槲覜]讀過源碼。 es5版本:(過兩天寫es6 版本的)由淺入深地講,先說使用, function person(age, sex) { this.age = age; this.sex = sex; this.clothes ...

    Corwien 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<