python之深淺拷貝

2021-08-16 10:29:08 字數 2284 閱讀 9513

lis_1 = [[3,"world"],1,'hello']

lis_2 = lis_1.copy()

print("列表1元素的id",lis_1,id(lis_1[0]),id(lis_1[0][0]),id(lis_1[0][1]),id(lis_1[1]),id(lis_1[2]))

print("列表2元素的id",lis_2,id(lis_2[0]),id(lis_2[0][0]),id(lis_2[0][1]),id(lis_2[1]),id(lis_2[2]))

print("-------------------分割線------------------------")

lis_2[0][0] = 5

lis_2[0][1] = 5

lis_2[1] = 2

lis_2[2] = "help"

print("列表2修改後列表1的id",lis_1,id(lis_1[0]),id(lis_1[0][0]),id(lis_1[0][1]),id(lis_1[1]),id(lis_1[2]))

print("列表2修改後列表2的id",lis_2,id(lis_2[0]),id(lis_2[0][0]),id(lis_2[0][1]),id(lis_2[1]),id(lis_2[2]))

檢視輸出的結果如下圖

通過檢視元素的id可以發現,列表1,拷貝後賦值給列表2之後,在記憶體中的指向還是同乙個記憶體位址

畫的記憶體資料指向圖如圖示,列表1,2的第乙個元素均指向了同乙個記憶體位址,但是這個位址中存放的不是資料而是巢狀的記憶體位址,這個記憶體位址指向的才是存有不變型別的資料記憶體位址.

根據影象的變化可以很清楚的看出來資料在記憶體中是如何進行拷貝的,這就是所謂的深淺拷貝,淺拷貝在這個列表中進行的拷貝操作.

所謂的深拷貝就是完全建立乙個新的在記憶體中互不影響.

lis_1 = [[3,"world"],1,'hello']

lis_2 = lis_1

print("列表1元素的id",lis_1,id(lis_1),id(lis_1[0]),id(lis_1[0][0]),id(lis_1[0][1]),id(lis_1[1]),id(lis_1[2]))

print("列表2元素的id",lis_2,id(lis_2),id(lis_2[0]),id(lis_2[0][0]),id(lis_2[0][1]),id(lis_2[1]),id(lis_2[2]))

print("-------------------分割線------------------------")

lis_2[0][0] = 5

lis_2[0][1] = 5

lis_2[1] = 2

lis_2[2] = "help "

print("列表2修改後列表1的id",lis_1,id(lis_1),id(lis_1[0]),id(lis_1[0][0]),id(lis_1[0][1]),id(lis_1[1]),id(lis_1[2]))

print("列表2修改後列表2的id",lis_2,id(lis_2),id(lis_2[0]),id(lis_2[0][0]),id(lis_2[0][1]),id(lis_2[1]),id(lis_2[2]))

執行結果如圖所示:

在不做修改之前賦值和copy的資料在記憶體中的資料沒有什麼不同

so,在進行賦值操作之後會發現賦值操作和copy操作是不同的,

賦值操作是記憶體位址的完全指向相同.

字串的id是八位位址

列表的id同樣是八位位址

數字的id是十位位址

在這裡進行乙個猜測在python中序列在記憶體中的位址是八位的,而基本的資料型別在記憶體中是十位的.

python之深淺拷貝

基礎沒打牢,python的深淺copy老是混淆,模稜兩可的。一 物件賦值 a 1,2,3 b a 物件賦值 print id a print id b 執行上面的 可以發現id a id b 為什麼呢?其實是在記憶體中有乙個列表 1,2,3 a和b就是兩個標籤,都指向列表 1,2,3 如下圖 當修改...

python之深淺拷貝

對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址。importcopy 數字 字串 n1 123 n1 age 10 print id n1 賦值 n2 n1 print id n2 淺拷貝 n2 copy.copy n1 print id n2 深拷貝 n3 ...

python之深淺拷貝

在python中的資料型別包括 bool,int,float,str,set,list,tuple,dict等。簡單資料型別 bool,int,float,str 複雜資料型別 list,tuple,set,dict 對於簡單的資料型別變數在記憶體中儲存都是儲存 資料本身 而對於複雜的資料型別來說,...