日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Python中直接賦值、淺拷貝和深拷貝的區(qū)別

作者:獵貓騎巨獸 更新時(shí)間: 2022-07-21 編程語言

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

欄目分類
最近更新