Python賦值 深淺copy

2022-07-31 19:12:10 字數 1181 閱讀 1695

在 python 中,物件的賦值就是簡單的物件引用,這點和 c++不同,如下所示

a = [1, 2, 'hello', ['python', 'c++']]

b = a

在上述情況下,a 和 b 是一樣的,他們指向同一片記憶體,b 不過是 a 的別名,是引用.

我們可以使用 b is a 去判斷,返回 true,表明他們位址相同,內容相同,也可以使用 id()函式來檢視兩個列表的位址是否相同。

賦值操作(包括物件作為引數、返回值)不會開闢新的記憶體空間,它只是複製了物件的引用。也就是說除了 b 這個名字之外,沒有其他的記憶體開銷。修改了 a,也就影響了 b,同理,修改了 b,也就影響了 a。

淺拷貝會建立新物件,其內容非原物件本身的引用,而是原物件內第一層物件引用

淺拷貝有三種形式:

深拷貝只有一種形式,copy 模組中的 deepcopy()函式

深拷貝和淺拷貝對應,深拷貝拷貝了物件的所有元素,包括多層巢狀的元素。因此,它的時間和空間開銷要高。

同樣的對列表 a,如果使用 b = copy.deepcopy(a),再修改列表 b 將不會影響到列表 a,即使巢狀的列表具有更深的層次,也不會產生任何影響,因為深拷貝拷貝出來的物件根本就是乙個全新的物件,不再與原來的物件有任何的關聯

對於非容器型別,如數字、字元,以及其他的「原子」型別,沒有拷貝一說,產生的都是原物件的引用

如果元組變數值包含原子型別物件,即使採用了深拷貝,也只能得到淺拷貝。

import copy

a = [1, 2, 3, [4, 5], 6]

b = a

c = copy.copy(a)

d = copy.deepcopy(a)

print(a, b, c, d, sep='\n')

"""[1, 2, 3, [4, 5, 11], 6, 10]

[1, 2, 3, [4, 5, 11], 6, 10]

[1, 2, 3, [4, 5, 11], 6]

[1, 2, 3, [4, 5, 12], 6]

"""

python深淺copy和賦值

基於引用和物件 python引用和物件分離 直接賦值 a b a,b兩個引用指向相同的物件 淺copy a為b的copy copy 新建 b的不可變子物件,共用可變子物件 深copy a為b的深copy copy 新建 b的所有子物件,兩者物件無關聯 詳細解析如下 在python中,物件賦值實際上是...

python 賦值 比較 深淺copy

物件的三個要素id,型別,值。id 指的是記憶體位址,id 相同則兩個物件完全相同 賦值運算,a b,指的是b 的id 與a 相同,b 的資料與a 指向相同的記憶體空間 is 判斷,返回true false,a is b 判斷a 與 b 的id 是否相同 判斷,等號兩邊的值相等 練習1a 123 b...

賦值運算與深淺copy

1 複製運算 l1 1,2,3,a b l2 l1 l1 0 111 print l1 111,2,3,a b print l2 111,2,3,a b l1 3 0 hello print l1 111,2,3,hello b print l2 111,2,3,hello b 所以,對於賦值運算來...