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