list深度拷貝,Python 直接賦值、淺拷貝和深度拷貝全解析

 2023-10-18 阅读 26 评论 0

摘要:直接賦值:其實就是對象的引用(別名,其實就是一個人今天叫張三 明天叫張狗子的意思)。 淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。 深拷貝(deepcopy):?copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子
  • 直接賦值:其實就是對象的引用(別名,其實就是一個人今天叫張三 明天叫張狗子的意思)。

  • 淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。

  • 深拷貝(deepcopy):?copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子對象。

list深度拷貝。?

? ? ?下面是引用兩個作者的內容 附上鏈接

https://www.cnblogs.com/huangbiquan/archive/2017/11/06/7795152.html

?1.賦值: 只是復制了新對象的引用,不會開辟新的內存空間。
? 2.淺拷貝: 創建新對象,其內容是原對象的引用。
? ? 淺拷貝有三種形式:切片操作,工廠函數,copy模塊中的copy函數。
? ? 如: lst = [1,2,3,[4,5]]?
? ? 切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst]
? ? 工廠函數:lst1 = list(lst)
? ? copy函數:lst1 = copy.copy(lst)

es6對象深拷貝。?

? ? 淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在lst中有一個嵌套的list[4,5],如果我們修改了它,情況就不一樣了。

?

? 3.深拷貝:只有一種形式,copy模塊中的deepcopy函數。
? ? ?和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。
? ? ?深拷貝出來的對象是一個全新的對象,不再與原來的對象有任何關聯。

>>> import copy
>>> a = [1,2,3,4,['a','b']] #定義一個列表a
>>> b = a #賦值
>>> c = copy.copy(a) #淺拷貝
>>> d = copy.deepcopy(a) #深拷貝>>> a.append(5)
>>> print(a)
[1, 2, 3, 4, ['a', 'b'], 5] #a添加一個元素5
>>> print(b) 
[1, 2, 3, 4, ['a', 'b'], 5] #b跟著添加一個元素5 
>>> print(c)
[1, 2, 3, 4, ['a', 'b']] #c保持不變
>>> print(d)
[1, 2, 3, 4, ['a', 'b']] #d保持不變>>> a[4].append('c') 
>>> print(a)
[1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])添加一個元素c
>>> print(b)
[1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟著添加一個元素c
>>> print(c)
[1, 2, 3, 4, ['a', 'b', 'c']] #c跟著添加一個元素c
>>> print(d)
[1, 2, 3, 4, ['a', 'b']] #d保持不變#說明如下:
#1.外層添加元素時, 淺拷貝c不會隨原列表a變化而變化;內層list添加元素時,淺拷貝c才會變化。
#2.無論原列表a如何變化,深拷貝d都保持不變。
#3.賦值對象隨著原列表一起變化


Python 直接賦值、淺拷貝和深度拷貝解析

復制拷貝指針的數據?https://www.cnblogs.com/alinh/p/6603976.html

  • 直接賦值:其實就是對象的引用(別名)。

  • 淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。

  • 深拷貝(deepcopy):?copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子對象。

拷貝函數和賦值?字典淺拷貝實例

實例

1
2
3
4
5
6
7
>>>a?=?{1: [1,2,3]}
>>> b?=?a.copy()
>>> a, b
({1: [1,?2,?3]}, {1: [1,?2,?3]})
>>> a[1].append(4)
>>> a, b
({1: [1,?2,?3,?4]}, {1: [1,?2,?3,?4]})

深度拷貝需要引入 copy 模塊:

實例

1
2
3
4
5
6
7
>>>import?copy
>>> c?=?copy.deepcopy(a)
>>> a, c
({1: [1,?2,?3,?4]}, {1: [1,?2,?3,?4]})
>>> a[1].append(5)
>>> a, c
({1: [1,?2,?3,?4,?5]}, {1: [1,?2,?3,?4]})

解析

鏈表的深度拷貝。1、b = a:?賦值引用,a 和 b 都指向同一個對象。

2、b = a.copy():?淺拷貝, a 和 b 是一個獨立的對象,但他們的子對象還是指向統一對象(是引用)。

python 淺拷貝、3、b = copy.deepcopy(a):?深度拷貝, a 和 b 完全拷貝了父對象及其子對象,兩者是完全獨立的。

更多實例

以下實例是使用 copy 模塊的 copy.copy( 淺拷貝 )和(copy.deepcopy ):

實例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# -*-coding:utf-8 -*-
??
import?copy
a?=?[1,?2,?3,?4, ['a',?'b']]?#原始對象
??
b?=?a???????????????????????#賦值,傳對象的引用
c?=?copy.copy(a)????????????#對象拷貝,淺拷貝
d?=?copy.deepcopy(a)????????#對象拷貝,深拷貝
??
a.append(5)?????????????????#修改對象a
a[4].append('c')????????????#修改對象a中的['a', 'b']數組對象
??
print(?'a = ', a )
print(?'b = ', b )
print(?'c = ', c )
print(?'d = ', d )

拷貝函數?以上實例執行輸出結果為:

1
2
3
4
('a = ', [1,?2,?3,?4, ['a',?'b',?'c'],?5])
('b = ', [1,?2,?3,?4, ['a',?'b',?'c'],?5])
('c = ', [1,?2,?3,?4, ['a',?'b',?'c']])
('d = ', [1,?2,?3,?4, ['a',?'b']])

?

轉載于:https://www.cnblogs.com/Aljt/p/7854208.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/146312.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息