1. 程式人生 > 其它 >python - 深淺拷貝

python - 深淺拷貝

前言

在Python中一切皆物件,任何物件都有三個屬性:唯一標識、型別、值。

id() ,是Python的一個內建函式,返回物件的唯一標識,用於獲取物件的記憶體地址。

對於某個物件,如何建立它的拷貝,就是說如何建立與該物件具有相同值的另外一個物件?

L1 = [[1, 2], 9]
L2 = L1[:]  # 使用切片
print(L2)  # [[1, 2], 9]

判斷 L1 和 L2 是否使用了相同的記憶體地址。

L1 = [[1, 2], 9]
L2 = L1[:]
print(L2)  # [[1, 2], 9]

print("L1記憶體地址:%s" % id(L1))  # 3757064
print("L2記憶體地址:%s" % id(L2))  # 31379592

由此可見,L1和L2使用了不同的記憶體地址。


判斷 L1 和L2 中對應的兩個元素引用的列表物件是否一樣

L1 = [[1, 2], 9]
L2 = L1[:]
print(L2)  # [[1, 2], 9]
print("L1[0]記憶體地址:%s" % id(L1[0]))  # 1856008
print("L2[0]記憶體地址:%s" % id(L2[0]))  # 1856008

print("L1[1]記憶體地址:%s" % id(L1[1]))  # 8791123393856
print("L2[1]記憶體地址:%s" % id(L2[1]))  # 8791123393856

列表 L1 和 L2 中的整數物件的記憶體地址是一樣的。

淺拷貝
對於某個物件,雖然建立了與該物件具有相同值的另外一個物件,但是這兩個物件內部巢狀的對應子物件全部都是同一個物件。就是說外部進行了拷貝,內部沒有進行拷貝。


總結

以下方式得到的拷貝都是淺拷貝:
1、切片操作
2、呼叫列表、字典、集合的操作 copy
3、呼叫標準庫模組copy中的copy

L2 = L1.copy()
L2 = list(L1)
L2 = copy.copy(L1)

得到的結果都是一樣的