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

2022-10-04 06:12:09 字數 1743 閱讀 7148

概述

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

列表賦值

# 定義乙個新列表

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

# 對l2賦值

l2 = l1

print(l1)

l2usiilcfv[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.cop程式設計客棧y(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]也發生了改變,那麼怎麼實現真正usiilcfv的完全的拷貝呢?

深拷貝www.cppcns.com

利用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列表賦值複製深拷貝及5種淺拷貝

本文位址:

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,...

Python列表賦值 淺copy 深copy的區別

1.python中列表的賦值操作 賦值操作在其他語言裡也很常見,例 name1 centos 123123,fedora freebsd uos deepin flag name2 name1 這是python中列表的賦值方式,經過列印後列表name2和列表name1是一樣的 centos 1231...

Python 列表切片陷阱 引用 複製與深複製

python 列表的切片和賦值操作很基礎,之前也遇到過一些坑,以為自己很懂了。但今天刷 codewars 時發現了乙個更大的坑,故在此記錄。python 列表賦值 複製 值 還是 引用 很多入門 python 的人會犯這樣乙個錯誤 在賦值操作 中搞不清是賦了 值 還是 引用 比如 a 1 2,3 b...