python的深淺拷貝

2022-07-17 11:12:11 字數 1525 閱讀 3192

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

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

深拷貝:外圍和內部元素都進行了拷貝物件本身,而不是引用。也就是,將全部的物件都複製一遍。

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

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

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

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

可變物件:可以修改的物件,比如列表、字典

1、減少記憶體的使用

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

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

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

import copy

'''tu = (1,2,3,(3,4,5))

tu_1 = copy.deepcopy(tu) #對於不可變物件,深淺拷貝都一樣,拷貝的是記憶體位址

tu_1 = (3,4,5) #值改變,位址也會改變

# print(id(tu),id(tu_1))

#拷貝 - 可變物件

li_1 = [1,2,3,4,[5,6,7]]

# '=' 記憶體位址一樣,指向的是同乙個物件

li_2 = li_1

print(id(li_1),id(li_2)) # 2826200972232 2826200972232

print(li_1) #li_2發生了改變 li_1也會發生改變

# copy - 淺拷貝 只拷貝第一層和第二層的位址引用

li_2 = copy.copy(li_1)

print(id(li_1[4]),id(li_2[4])) #裡面第二層的list位址一樣,證明指向的是同乙個東西

#只改變最外面一層,對另乙個沒有影響

print(li_2) # [1, 2, 3, 4, [5, 6, 7]]

#如果改變第二層,另乙個也會改變

print(li_2) # [1, 2, 3, 4, [5, 6, 7, '改變的東西']]

# deepcopy - 深拷貝 將所有層的東西都複製一遍

li_1 = [1,2,3,4,[5,6,7]]

li_2 = copy.deepcopy(li_1)

print(id(li_1),id(li_2)) #第一層位址不同

print(id(li_1[4]),id(li_2[4])) #第二層位址不同

#第乙個li_1發生改變 跟li_2沒有關係

print(li_2) # [1, 2, 3, 4, [5, 6, 7]]

'''

對於可變物件的深淺拷貝:

python 深淺拷貝案例 python 深淺拷貝

深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...

python 深淺拷貝

建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...

python深淺拷貝

python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....