詳解Python列表賦值複製深拷貝及5種淺拷貝

這篇文章主要介紹了Python列表賦值,複製,深拷貝以及5種淺拷貝詳解,本文給大家介紹的非常詳細,具有一定的參考借鑑價值,需要的朋友可以參考下
概述

在列表複製這個問題,看似簡單的複製卻有着許多的學問,尤其是對新手來說,理所當然的事情卻並不如意,比如列表的賦值、複製、淺拷貝、深拷貝等繞口的名詞到底有什麼區別和作用呢?

列表賦值

# 定義一個新列表
l1 = [1, 2, 3, 4, 5]
# 對l2賦值
l2 = l1
print(l1)
l2[0] = 100
print(l1)

示例結果:

[1, 2, 3, 4, 5]
[100, 2, 3, 4, 5]

可以看到,更改賦值後的L2後L1同樣也會被更改,看似簡單的“複製”,在Python中,列表屬於可變對象,而對可變對象的複製其實就是將列表的內存空間類似C中的指針再次指向新的變量名,而不是諸如字符串這種不可變對象在複製時會創建新的內存空間進行賦值。即此時L1和L2指向的是同一片內存空間,那麼怎麼實現真正複製呢?

淺拷貝

當列表中的元素爲不可變對象時,我們可以用以下方法對列表進行賦值:

import copy
# 定義一個新列表
L0 = [1, 2, 3, 4, 5]
print(L0)
print('-'*40)

利用切片

L1 = L0[:]
L1[0] = 100
print(L0)

利用模塊copy

import copy
L2 = copy.copy(L0)
L2[0] = 100
print(L0)

利用list()

L3 = list(L0)
L3[0] = 100
print(L0)

利用列表方法extend

L4 = []
L4.extend(L0)
L4[0] = 100
print(L0)

利用列表推導

L5 = [i for i in L0]
L5[0] = 100
print(L0)

可以看到最終的打印結果都是[1, 2, 3, 4, 5],我們成功進行了列表的複製,但是爲了條件需要是列表中元素爲不可變對象呢? 因爲如果列表中的元素爲可變對象,在複製時有會發生對象的引用,而不是新建內存空間進行引用,比如:

L0 = [1, 2, [3], 4, 5]
print(L0)
L2 = L0[:]
L2[2][0] = 100
print(L0)

示例結果:

[1, 2, [3], 4, 5]
[1, 2, [100], 4, 5]

可以看到,當列表L0中含有可變對象時,對複製後的L1進行改變其中可變對象元素L2[2]時,L0中的可變對象L0[2]也發生了改變,那麼怎麼實現真正的完全的拷貝呢?

深拷貝

利用copy模塊中的deepcopy進行深拷貝:

import copy
L0 = [1, 2, [3], 4, 5]
print(L0)
L2 = copy.deepcopy(L0)
L2[2][0] = 100
print(L2)
print(L0)

示例結果:

[1, 2, [100], 4, 5]
[1, 2, [3], 4, 5]

薦我們的python學習基地,看前輩們是如何學習的!從基礎的python腳本、爬蟲、django、數據挖掘等編程技術,還有整理零基礎到項目實戰的資料,送給每一位愛學習python的小夥伴!每天都有老前輩定時講解Python技術,分享一些學習的方法和需要留意的小細節,點擊加入我們的 python學習者聚集地

總結
以上所述是小編給大家介紹的詳解Python列表賦值複製深拷貝及5種淺拷貝,希望對大家有所幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章