這篇文章帶給大家的內容是關於Python中賦值&淺拷貝&深拷貝的簡單介紹(範例) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
在寫dict資料型別時,有提到「賦值語句」與copy()函數。
其實說到深淺拷貝,需要考慮具體的資料型態。 一部分是不可變對象,如數字、字串;另一部分是可變對象,如列表、字典等
變數:一個系統表的元素,指向物件的連接空間。
物件:被分配的一塊內存,儲存其實際的值。
引用:從變數到物件的指標。
不可變物件:一旦建立就不可以修改,如數字、字串、元組。
可變物件:可以修改的對象,如列表、字典。
賦值:透過語句「=」實作。左邊是新建的變量,右邊可以是直接內容,或是已存在的變數。是對象的引用,Python沒有拷貝該對象,只是拷貝了對象的引用,新變數指向來源變數記憶體位址。
淺拷貝:對一個物件進行拷貝。拷貝最外圍的物件本身,內部的元素都只是拷貝了一個引用而已。即新建立了一個類型跟原物件一樣、內容是原始物件的參考。 【淺拷貝物件是新的,物件的引用內容是舊的。 】
淺拷貝實作的幾種方式:(1)切片:[:];(2)工廠函數,如list()、dict();(3)使用copy()。
深拷貝:外圍和內部元素都進行了拷貝物件本身,而不是引用。即把物件複製一遍,並且該物件中引用的其他物件也複製。
對於不可變對象,例如數字和字串而言,賦值(=)、淺拷貝( copy())和深拷貝(deepcopy())沒有區別,因為他們的物件參考永遠指向同一個記憶體位址。
透過範例示範:
>>> 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
你會發現var_1 ~ var_4 的id指向是一樣的。
對list、dict等資料型別而言,賦值、淺拷貝和深拷貝,他們對記憶體位址的變化是不同的。
賦值淺拷貝:值相等,位址相等;
copy淺拷貝:值相等,位址不相等;
deepcopy深拷貝:值相等,位址不相等;
範例一:
base[0]='name',是一個string,不可變物件;base[1]=[ 'age',18],是list,可變物件。
base_1、base_2均是base的淺拷貝,三者id()一樣。
當對第一個string元素進行不同的更改時,發現id各不相同,不會互相影響,因為字串(不可變)被顯示的拷貝,當修改後,新創建了一個字元物件。
而修改第二個list元素時,不同的修改都只對最後一次修改生效,且互相影響,因為第二個元素列表只是簡單的複製了其引用,修改任何一個淺拷貝,都會修改引用的內容。
範例二:深拷貝
建立一個字典對象,並使用深拷貝建立一個新的對象。
>>>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’元素的内存地址是相同的 >>> >>> 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
相關建議:
#以上是Python中賦值&淺拷貝&深拷貝的簡單介紹(範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!