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