python列表 淺拷貝與深拷貝的區別

2021-09-27 05:51:33 字數 1554 閱讀 6335

首先得說說列表為什麼需要拷貝,就是為了解決簡單賦值操作,傳位址的問題,因為賦值過去的列表,其實指向的是同乙個位址,問題說明看**

a = [1,2,3]

b = a

# list型別,簡單賦值操作,是傳位址

print(id(a))

print(id(b))

b[1] = 6

print(b)

print(a)

執行結果,輸出的是:

2460317409864

2460317409864

[1, 6, 3]

[1, 6, 3]

#同一位址,修改b的列表,a也會同時改變。

為了解決以上問題,list賦值需要採用copy函式
a = [1,2,3]

b = a.copy()

print(id(a))

print(id(b))

b[1] = 6

print(b)

print(a)

但是由於copy只是淺拷貝,其只拷貝一層

# 出現下列問題的原因是,copy『函式是個淺拷貝函式,即只拷貝一層內容

# 深拷貝需要使用copy模組

a = [1,2,3,[10,20,30]]

b = a.copy()

print(id(a))

print(id(b))

print('*' * 20)

print(id(a[3]))

print(id(b[3]))

a[3][2]=666

print(a)

print(b)

以上**輸出結果為:

2963694903944

2964112968904

********************

2963694903880

2963694903880

[1, 2, 3, [10, 20, 666]]

[1, 2, 3, [10, 20, 666]]

接下來演示一下深拷貝

import copy

a = [1,2,3,[10,20,30]]

b = copy.deepcopy(a) #這裡不一樣哦

print(id(a))

print(id(b))

print('*' * 20)

print(id(a[3]))

print(id(b[3]))

a[3][2]=666

print(a)

print(b)

#輸出結果:

2620494013064

2620883635400

********************

2620494013000

2620495283144

[1, 2, 3, [10, 20, 666]]

[1, 2, 3, [10, 20, 30]]

#這才是我們想要得到的目的

不明白的可以自己實踐操作試試

Python 列表的 賦值拷貝 淺拷貝與深拷貝

一 文字說明 在對原有列表進行操作的時候,很有可能會修改原有列表的值,所以根據需要在這之前最好先將原有列表拷貝乙份,在對它的副本進行操作,而原列表保持不變。這個時候就需要注意 如何拷貝 的問題,因為它牽扯到 對於你新拷貝出來的列表進行操作是否還是會修改原有列表的值。通過學習,我有以下總結,對於列表一...

列表的深拷貝與淺拷貝

lst0 0,1,3,3 lst1 0,1,3,3 lst3 0,1,2,3,11,12,13,14 print lst0 lst1 true 比較兩個列表的值 print lst0 is lst1 false 比較兩個列表的id lst1 lst0 lst0 lst1同時指向同乙個列表,所以改變任...

Python 淺拷貝與深拷貝

淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...