摘要:淺拷貝對一個對象進行拷貝。二不可變對象對于不可變對象,例如數(shù)字和字符串而言,賦值淺拷貝和深拷貝沒有區(qū)別,因為他們的對象引用永遠指向同一個內(nèi)存地址。三可變對象對等數(shù)據(jù)類型而言,賦值淺拷貝和深拷貝,他們對內(nèi)存地址的變化是不同的。
在寫dict數(shù)據(jù)類型時,有提到過“賦值語句”與copy()函數(shù)。
其實說到深淺拷貝,需要考慮具體的數(shù)據(jù)類型。一部分是不可變對象,如數(shù)字、字符串;另一部分是可變對象,如列表、字典等。
變量:一個系統(tǒng)表的元素,指向?qū)ο蟮倪B接空間。
對象:被分配的一塊內(nèi)存,存儲其實際的值。
引用:從變量到對象的指針。
不可變對象:一旦創(chuàng)建就不可以修改,如數(shù)字、字符串、元組。
可變對象:可以修改的對象,如列表、字典。
賦值:通過語句“=”實現(xiàn)。左邊是新建的變量,右邊可以是直接內(nèi)容,或者已存在的變量。是對象的引用,Python沒有拷貝該對象,只是拷貝了對象的引用,新變量指向源變量內(nèi)存地址。
淺拷貝:對一個對象進行拷貝。拷貝最外圍的對象本身,內(nèi)部的元素都只是拷貝了一個引用而已。即新創(chuàng)建了一個類型跟原對象一樣、內(nèi)容是原對象的引用。【淺拷貝對象是新的,對象的引用內(nèi)容是舊的。】
淺拷貝實現(xiàn)的幾種方式:(1)切片:[:];(2)工廠函數(shù),比如list()、dict();(3)使用copy()。
深拷貝:外圍和內(nèi)部元素都進行了拷貝對象本身,而不是引用。即把對象復制一遍,并且該對象中引用的其他對象也復制。
二、不可變對象對于不可變對象,例如數(shù)字和字符串而言,賦值(=)、淺拷貝(copy())和深拷貝(deepcopy())沒有區(qū)別,因為他們的對象引用永遠指向同一個內(nèi)存地址。
通過例子演示:
>>> var_1 = 123 >>> id(var_1) # 通過id()查看地址 1615552144 >>> var_2 = var_1 >>> id(var_2) 1615552144 >>> >>> import copy # 淺、深拷貝需要導入copy模塊 >>> var_3 = copy.copy(var_1) >>> id(var_3) 1615552144 >>> >>> var_4 = copy.deepcopy(var_1) >>> id(var_4) 1615552144
你會發(fā)現(xiàn)var_1 ~ var_4 的id指向是一樣的。
三、可變對象對list、dict等數(shù)據(jù)類型而言,賦值、淺拷貝和深拷貝,他們對內(nèi)存地址的變化是不同的。
賦值淺拷貝:值相等,地址相等;
copy淺拷貝:值相等,地址不相等;
deepcopy深拷貝:值相等,地址不相等;
例子一:
base[0]=’name’,是一個string,不可變對象;base[1]=[‘a(chǎn)ge’,18],是list,可變對象。
base_1、base_2均是base的淺拷貝,三者id()一樣。
當對第一個string元素進行不同的更改時,發(fā)現(xiàn)id各不相同,不會互相影響,因為字符串(不可變)被顯示的拷貝,當修改后,新創(chuàng)建了一個字符對象。
而修改第二個list元素時,不同的修改都只對最后一次修改生效,且互相影響,因為第二個元素列表只是簡單的復制了其引用,修改任何一個淺拷貝,都會修改引用的內(nèi)容。
例子二:深拷貝
創(chuàng)建一個字典對象,并使用深拷貝創(chuàng)建一個新的對象。
>>>import copy >>> var = {"a":1,"b":2,"c":[3,"abc"]} >>> var1 = copy.deepcopy(var) >>> id(var),id(var1) (17616992, 15671136) # 地址不相同 >>> id(var["c"]),id(var1["c"]) (15695144, 15695384) >>> id(var["c"][0]),id(var1["c"][0]) (1615550224, 1615550224) # ‘c’元素的內(nèi)存地址是相同的 >>> >>> var1["c"][0] = 4 >>> var {"a": 1, "b": 2, "c": [3, "abc"]} >>> var1 {"a": 1, "b": 2, "c": [4, "abc"]} >>> id(var["c"][0]),id(var1["c"][0]) (1615550224, 1615550240) # 對var1的修改沒有影響var
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42322.html
摘要:對于而言,情況可能會有點小復雜,因為一切皆為對象,所以的普通賦值深拷貝和淺拷貝之間都是有細微區(qū)別的。二下的他們在中,對象的賦值和傳遞都是引用。 一、深拷貝與淺拷貝 ??深拷貝:賦值時值完全復制,完全的copy,對其中一個作出改變,不會影響另一個 ??淺拷貝:賦值時,引用賦值,相當于取了一個別名。對其中一個修改,會影響另一個 ??對于PHP而言,= 賦值時,普通對象是深拷貝,但對對象來說...
摘要:對于而言,情況可能會有點小復雜,因為一切皆為對象,所以的普通賦值深拷貝和淺拷貝之間都是有細微區(qū)別的。二下的他們在中,對象的賦值和傳遞都是引用。 一、深拷貝與淺拷貝 ??深拷貝:賦值時值完全復制,完全的copy,對其中一個作出改變,不會影響另一個 ??淺拷貝:賦值時,引用賦值,相當于取了一個別名。對其中一個修改,會影響另一個 ??對于PHP而言,= 賦值時,普通對象是深拷貝,但對對象來說...
摘要:作者本文原載于,不允許轉(zhuǎn)載的參數(shù)傳遞的參數(shù)傳遞,無法控制引用傳遞還是值傳遞。對于不可變對象數(shù)字字符元組等的參數(shù),更類似值傳遞對于可變對象列表字典等,更類似引用傳遞。 作者:LogM 本文原載于 https://segmentfault.com/u/logm/articles ,不允許轉(zhuǎn)載~ 1. Python 的參數(shù)傳遞 Python的參數(shù)傳遞,無法控制引用傳遞還是值傳遞。對于不可變對...
摘要:之前關(guān)于的作用域賦值參數(shù)傳遞,我們接連談了幾篇文章全菊變量和菊部變量關(guān)于函數(shù)參數(shù)傳遞,人都錯了可變對象與不可變對象今天我們依然要就相關(guān)話題繼續(xù)下去。這是由于它們是不可變對象,不存在被修改的可能,所以拷貝和賦值是一樣的。 之前關(guān)于 Python 的作用域、賦值、參數(shù)傳遞,我們接連談了幾篇文章: 全菊變量和菊部變量 關(guān)于函數(shù)參數(shù)傳遞,80%人都錯了 可變對象與不可變對象 今天我們依然要...
閱讀 1672·2021-10-29 13:11
閱讀 836·2021-09-22 10:02
閱讀 1696·2021-08-20 09:35
閱讀 1558·2019-08-30 15:54
閱讀 2465·2019-08-30 15:44
閱讀 1389·2019-08-29 16:52
閱讀 1104·2019-08-23 12:56
閱讀 762·2019-08-22 15:16