網(wǎng)站首頁 編程語言 正文
Python中直接賦值、淺拷貝和深拷貝的區(qū)別
- 1 Python中直接賦值、淺拷貝和深拷貝的概念
- 2 淺拷貝和深拷貝在內(nèi)存地址上的區(qū)別
- 3 舉例說明
- 參考資料
1 Python中直接賦值、淺拷貝和深拷貝的概念
直接賦值: 創(chuàng)建一個別名,本質(zhì)上是對象引用。
淺拷貝: 拷貝父對象,而不會拷貝父對象內(nèi)部的子對象。操作上,重新分配一塊內(nèi)存用于創(chuàng)建父對象,內(nèi)部包含子對象的引用。
深拷貝: 完全拷貝父對象和子對象。新對象與原對象不再有關(guān)系。
2 淺拷貝和深拷貝在內(nèi)存地址上的區(qū)別
此處引用 時(shí)代&信念 的博文內(nèi)容。
淺拷貝:
父對象數(shù)據(jù)類型 | 子對象數(shù)據(jù)類型 | 父對象地址 | 子對象地址 |
---|---|---|---|
可變 | 可變 | 改變 | 相同 |
可變 | 不可變 | 改變 | 相同 |
不可變 | 可變 | 相同 | 相同 |
不可變 | 不可變 | 相同 | 相同 |
結(jié)論: 使用淺拷貝時(shí),子對象相同;如果父對象為可變數(shù)據(jù)類型,則父對象不同,如果父對象為不可變數(shù)據(jù)類型,則父對象相同。
深拷貝:
父對象數(shù)據(jù)類型 | 子對象數(shù)據(jù)類型 | 父對象地址 | 子對象地址 |
---|---|---|---|
可變 | 可變 | 改變 | 改變 |
可變 | 不可變 | 改變 | 相同 |
不可變 | 可變 | 改變 | 改變 |
不可變 | 不可變 | 相同 | 相同 |
結(jié)論: 使用深拷貝時(shí),如果子對象為可變數(shù)據(jù)類型,父對象和子對象都不同;如果子對象為不可變類型,子對象相同,父對象根據(jù)父對象的數(shù)據(jù)類型而定。
3 舉例說明
import copy
a = [1, ['a', 'b']]
b = a
c = a.copy()
d = copy.deepcopy(a)
print(a is b)
print(a is c)
print(a is d)
print(a[0] is b[0])
print(a[0] is c[0])
print(a[0] is d[0])
a.append(5) # 增加父對象中的元素
print(a)
print(b)
print(c)
print(d)
a[0] = 6 # 修改父對象中的元素
print(a)
print(b)
print(c)
print(d)
a[1].append('c') # 增加子對象中的元素
print(a)
print(b)
print(c)
print(d)
''' 輸出結(jié)果 '''
True # b和a指向同一個父對象
False # c、d與a指向不同的父對象
False
True
True # a、c指向相同的子對象
False
[1, ['a', 'b'], 5]
[1, ['a', 'b'], 5]
[1, ['a', 'b']]
[1, ['a', 'b']]
[6, ['a', 'b'], 5] # a[0]指向新的子對象
[6, ['a', 'b'], 5]
[1, ['a', 'b']] # c[0]仍指向原來的子對象
[1, ['a', 'b']]
[6, ['a', 'b', 'c'], 5]
[6, ['a', 'b', 'c'], 5]
[1, ['a', 'b', 'c']] # c和a的子對象相同
[1, ['a', 'b']]
注意: 在Python中,根本沒有辦法刪除值。 使用
del
只能刪除對象名稱。當(dāng)一個值(放在內(nèi)存空間)沒有對象名稱與之關(guān)聯(lián)時(shí),Python解釋器會直接將其刪掉,稱為 “垃圾收集”。
參考資料
菜鳥教程. Python 直接賦值、淺拷貝和深度拷貝解析.
xzw96. Python 深拷貝和淺拷貝詳解. CSDN博客.
時(shí)代&信念. Python中的淺拷貝和深拷貝(一看就懂!!!). CSDN博客.
原文鏈接:https://blog.csdn.net/weixin_44254041/article/details/125895577
相關(guān)推薦
- 2021-11-10 Android?Studio設(shè)置繪制布局時(shí)的視圖_Android
- 2023-04-01 python加速器numba使用詳解_python
- 2022-12-21 QT+Quick實(shí)現(xiàn)自定義組件的示例詳解_C 語言
- 2023-07-22 JVM的類加載機(jī)制和垃圾回收機(jī)制
- 2023-01-20 實(shí)現(xiàn).Net7下數(shù)據(jù)庫定時(shí)檢查的方法詳解_實(shí)用技巧
- 2022-09-03 PyQt5實(shí)現(xiàn)tableWidget?居中顯示_python
- 2022-04-28 python中對列表的刪除和添加方法詳解_python
- 2022-09-14 C#通過不安全代碼看內(nèi)存加載的示例詳解_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支