python賦值 切片複製 淺拷貝 深拷貝區別

2021-08-21 02:50:24 字數 2802 閱讀 8025

2023年04月20日 16:58:35

在python中物件的賦值其實就是物件的引用。當建立乙個物件,把它賦值給另乙個變數的時候,python並沒有拷貝這個物件,只是拷貝了這個物件的引用而已。

淺拷貝:拷貝了最外圍的物件本身,內部的元素都只是拷貝了乙個引用而已。也就是,把物件複製一遍,但是該物件中引用的其他物件我不複製

深拷貝:外圍和內部元素都進行了拷貝物件本身,而不是引用。也就是,把物件複製一遍,並且該物件中引用的其他物件我也複製。

1,變數:是乙個系統表的元素,擁有指向物件的連線空間

2,物件:被分配的一塊記憶體,儲存其所代表的值

3,引用:是自動形成的從變數到物件的指標

4,注意:型別(int型別,long型別(python3已去除long型別,只剩下int型別的資料))屬於物件,不是變數

5,不可變物件:一旦建立就不可修改的物件,包括字串、元組、數字

6,可變物件:可以修改的物件,包括列表、字典。

1,切片可以應用於:列表、元組、字串,但不能應用於字典。

2,深淺拷貝,既可應用序列(列表、元組、字串),也可應用字典。

1,減少記憶體的使用

2,以後在做資料的清洗、修改或者入庫的時候,對原資料進行複製乙份,以防資料修改之後,找不到原資料。

不可變物件型別,沒有被拷貝的說法,即便是用深拷貝,檢視id的話也是一樣的,如果對其重新賦值,也只是新建立乙個物件,替換掉舊的而已。

一句話就是,不可變型別,不管是深拷貝還是淺拷貝,位址值和拷貝後的值都是一樣的。

a=(1

,2,3

)print

("*****第一種=號淺拷貝*****"

)b=a

print

(a)print

(b)print

(id(a))

print

(id(b))

print

("*****另一種copy淺拷貝==="

)b=copy

.copy

(a)print

(a)print

(b)print

(id(a))

print

(id(b))

print

("*****深拷貝*****"

)b=copy

.deepcopy(a)

print

(a)print

(b)print

(id(a))

print

(id(b))

# 結果如下:

*****淺拷貝*****

(1,2,3)

(1,2

,3)2814522335952

2814522335952

*****另一種淺拷貝===

(1,2,3)

(1,2

,3)2814522335952

2814522335952

*****深拷貝*****

(1,2,3)

(1,2

,3)2814522335952

2814522335952

a=[1

,2,3

]print

("*****第一種=號淺拷貝*****"

)b=a

print

(a)print

(b)print

(id(a))

print

(id(b))

print

("*****另一種copy淺拷貝==="

)b=copy

.copy

(a)print

(a)print

(b)print

(id(a))

print

(id(b))

print

("*****深拷貝*****"

)b=copy

.deepcopy(a)

print

(a)print

(b)print

(id(a))

print

(id(b))

#結果如下:

*****淺拷貝*****

[1,2,3]

[1,2

,3]2007696321544

2007696321544

*****另一種copy

淺拷貝===

[1,2,3]

[1,2

,3]2007696321544

2007695909960

*****深拷貝*****

[1,2,3]

[1,2

,3]2007696321544

2007696319560

1,深淺拷貝都是對源物件的複製,占用不同的記憶體空間。

2,不可變型別的物件,對於深淺拷貝毫無影響,最終的位址值和值都是相等的。

3,可變型別:

=淺拷貝: 值相等,位址相等

copy淺拷貝:值相等,位址不相等 (切片賦值是淺拷貝,只拷貝外側列表,子列表與原列表公用乙份,如果原列表的最外層增刪改查,淺拷貝後的列表不變。但是如果原列表的子列表增刪改查,淺拷貝後的子列表變化)

deepcopy深拷貝:值相等,位址不相等

Python 賦值 淺拷貝 深拷貝

賦值 a b,只拷貝了物件的引用,沒有拷貝內容。兩個物件的id一樣 淺拷貝 copy.copy 構造乙個新的復合物件,然後將子物件引用插入到原始物件的副本中。深拷貝 copy.deepcopy 構造乙個新的復合物件,然後遞迴地將子物件副本插入原始物件的副本。給個栗子 從這個栗子可以看出,對c進行修改...

python賦值 淺拷貝 深拷貝

視覺化 首先了解知識點 可變 list,dict 和不可變 string,int,tuple 淺拷貝 對於string int來說沒有意義,因為它們資料就一層,對於tuple由於是不可變型別所以新的物件會指向原來的物件位址,對於list和dict,新的物件會在記憶體中開闢乙個新的記憶體空間,並且只拷...

python賦值,淺拷貝和深拷貝

a 1 b a a 2 a 2 b 1 你將1賦給a變數,然後拷貝a中的值,將它賦給變數b。當稍 後將a中的值改變為2時,這不會影響b中的值。這是因為a和b 是不同的變數,儲存了不同的值。但列表不是這樣的。當你將列表賦給乙個變數時,實際上是將列表的 引用 賦給了該變數。引用是乙個值,指向某些資料。列...