日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python列表浅复制_Python列表的深复制和浅复制示例详解

發布時間:2025/4/5 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python列表浅复制_Python列表的深复制和浅复制示例详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、深復制與淺復制

列表是Python中自帶的一種數據結構,在使用列表時,拷貝操作不可避免,下面簡單討論一下列表的深復制(拷貝)與淺復制

首先看代碼:

l1 = [5, 4, 3, 2, 1]

# 用兩種方法實現對列表l1的拷貝

l2 = l1

l3 = l1[:]

print(l1) # [5, 4, 3, 2, 1]

print(l2) # [5, 4, 3, 2, 1]

print(l3) # [5, 4, 3, 2, 1]

#修改l1

l1[0] = 9

print(l1) # [9, 4, 3, 2, 1]

print(l2) # [9, 4, 3, 2, 1]

print(l3) # [5, 4, 3, 2, 1]

我們發現修改l1的第一個元素后,l2的第一個元素跟著改變,而l3并沒有發生變化。Python內置函數id()可以返回元素的地址,那么我們使用這個函數來看一下三個列表的地址:

print(id(l1)) # 2927957162504

print(id(l2)) # 2927957162504

print(id(l3)) # 2927923243528

從結果來看,l1和l2地址是一樣的,也就是說l1和l2指向的是同一塊內存區域,顯然,通過 l2 = l1 操作,l1和l2都成了指向同一塊內存地址的“指針”,也就是說這個操作是為l1取了一個別名,也可以說l2是l1的一個引用。用一張圖來解釋:

那么修改l1也就是在修改l2:

接下來看一下創建l3的過程,l3=l1[:] ,這是將l1進行切片,并將切片后的列表拷貝到l3所指向的內存區域,同樣看圖:

也就是說l1和l3指向不同的內存區域,那么修改l1并不會影響到l3:

通俗的來講,像l2這種,拷貝出來的對象和原對象的地址相同,為淺復制,像l3這種,分配新的內存空間并拷貝原始內容的,拷貝出來的對象和原對象的地址不同,為深復制。

二、復制列表內元素的淺復制

在復制列表中的所有元素的時候,進行淺復制

看一個比較有意思的東西,看代碼:

l1 = [1,2,3,[1,3]]

l2 = l1[:]

l1[3][1] = 9

print(l1) # [1, 2, 3, [1, 9]]

print(l2) # [1, 2, 3, [1, 9]]

按照前面的理解,修改l1某個元素后,l2應該不會發生改變,可結果卻與我們預想的結果大相徑庭,于是,我們不得不思考一下l2深復制到底復制了什么東西。實際上列表其實可以理解為一個“指針”,l1[3]是一個列表元素,l2[3]也是一個列表元素,執行以下代碼:

print(id(l2[3])) # 2014816956232

print(id(l1[3])) # 2014816956232

我們發現l1[3]和l2[3]指向的地址是一樣的,也就是說在執行l2 = l1[:] 的時候,將一個地址拷貝了,所以修改l1[3]相當于修改l2[3],所以才會出現上述結果,這更加說明了列表其實就是一個指向一片內存區域的“指針”。那么我們是不是可以說列表l2深復制l1,但是對列表中每個元素進行復制時進行的是淺復制呢?答案顯而易見。

修改l1[3]中的元素:

三、copy()和deepcopy()

copy模塊可以幫助我們實現對象的復制操作

列舉一下其他的拷貝列表的方式:

l4 = l1 * 1

print(id(l4)) # 2927957916296

l5 = list(l1)

print(id(l5)) # 2927957767816

import copy

l6 = copy.copy(l1)

print(id(l6)) # 2927956854024

l7 = copy.deepcopy(l1)

print(id(l7)) # 2927958503368

我們可以看到,這幾種拷貝方式所得到的的新對象與原對象的地址都不相同了,并沒有按照字面意思(copy進行淺復制,deepcopy進行深復制),那么copy()和deepcopy()究竟有什么區別呢,繼續看代碼:

list1 = [1,2,3,[1,3]]

list2 = list1[:]

list3 = copy.copy(list1)

list4 = copy.deepcopy(list1)

list1[3][0] = 9

print(list1) # [1, 2, 3, [9, 3]]

print(list2) # [1, 2, 3, [9, 3]]

print(list3) # [1, 2, 3, [9, 3]]

print(list4) # [1, 2, 3, [1, 3]]

print(id(list1[3])) # 2927923172616

print(id(list2[3])) # 2927923172616

print(id(list3[3])) # 2927923172616

print(id(list4[3])) # 2927967190728

可以發現copy()和前面提到的用 [:] 進行拷貝沒有本質上的區別,對列表中的每個元素進行復制時進行的是淺拷貝,而deepcopy()在復制列表中的每個元素的時候,進行的是深拷貝。

總結

到此這篇關于Python列表的深復制和淺復制的文章就介紹到這了,更多相關Python列表深復制和淺復制內容請搜索179885.Com以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持179885.Com!

總結

以上是生活随笔為你收集整理的python列表浅复制_Python列表的深复制和浅复制示例详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。