首頁 >後端開發 >Python教學 >Python中賦值&淺拷貝&深拷貝的簡單介紹(範例)

Python中賦值&淺拷貝&深拷貝的簡單介紹(範例)

不言
不言原創
2018-08-30 10:11:401325瀏覽

這篇文章帶給大家的內容是關於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元素時,不同的修改都只對最後一次修改生效,且互相影響,因為第二個元素列表只是簡單的複製了其引用,修改任何一個淺拷貝,都會修改引用的內容。

Python中賦值&淺拷貝&深拷貝的簡單介紹(範例)

範例二:深拷貝
建立一個字典對象,並使用深拷貝建立一個新的對象。

>>>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中的賦值運算子

Python中的賦值、淺拷貝、深拷貝介紹

#

以上是Python中賦值&淺拷貝&深拷貝的簡單介紹(範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn