亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中copy()?函數(shù)淺拷貝與深拷貝示例詳解

 更新時(shí)間:2025年11月14日 10:46:36   作者:Geoking.  
Python的copy()函數(shù)是copy模塊提供的一個(gè)用于創(chuàng)建對(duì)象淺拷貝的工具,這篇文章主要介紹了Python中copy()函數(shù)淺拷貝與深拷貝的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 Python 編程中,對(duì)象的拷貝(復(fù)制) 是一個(gè)常見又容易被忽視的概念。很多初學(xué)者在使用 copy() 時(shí),常常會(huì)遇到修改一個(gè)對(duì)象導(dǎo)致另一個(gè)對(duì)象也被改變的“奇怪現(xiàn)象”。本文將深入理解 Python 的 copy() 函數(shù)、淺拷貝與深拷貝的區(qū)別,并通過示例讓你徹底搞清楚它們的原理。

一、為什么需要拷貝對(duì)象?

當(dāng)你在 Python 中使用賦值語句時(shí),例如:

a = [1, 2, 3]
b = a

此時(shí),ab指向同一個(gè)對(duì)象。這意味著修改 b 也會(huì)影響 a

b.append(4)
print(a)  # 輸出:[1, 2, 3, 4]
print(b)  # 輸出:[1, 2, 3, 4]

這往往不是我們想要的結(jié)果。

如果希望創(chuàng)建一個(gè)“新的對(duì)象”,而不是僅僅復(fù)制引用,這時(shí)就需要用到 拷貝函數(shù)。

二、copy模塊簡介

Python 標(biāo)準(zhǔn)庫提供了一個(gè)專門用于復(fù)制對(duì)象的模塊:copy
該模塊中有兩個(gè)重要函數(shù):

  • copy.copy(x) —— 執(zhí)行 淺拷貝
  • copy.deepcopy(x) —— 執(zhí)行 深拷貝

我們先來看看淺拷貝。

三、淺拷貝 (copy.copy())

淺拷貝會(huì)創(chuàng)建一個(gè)新的對(duì)象,但不會(huì)遞歸地復(fù)制內(nèi)部的可變對(duì)象。

示例:

import copy

list_a = [1, [2, 3], 4]
list_b = copy.copy(list_a)

print(list_a == list_b)  # True,內(nèi)容相同
print(list_a is list_b)  # False,指向不同對(duì)象

修改外層列表時(shí),互不影響:

list_b.append(5)
print(list_a)  # [1, [2, 3], 4]
print(list_b)  # [1, [2, 3], 4, 5]

但修改內(nèi)部的可變對(duì)象時(shí),淺拷貝仍然會(huì)“聯(lián)動(dòng)”:

list_b[1].append(99)
print(list_a)  # [1, [2, 3, 99], 4]
print(list_b)  # [1, [2, 3, 99], 4, 5]

? 結(jié)論:淺拷貝只復(fù)制最外層容器,內(nèi)部元素仍然是原對(duì)象的引用。

四、深拷貝 (copy.deepcopy())

深拷貝則會(huì)遞歸地復(fù)制所有對(duì)象,生成完全獨(dú)立的一份副本。

import copy

list_a = [1, [2, 3], 4]
list_b = copy.deepcopy(list_a)

list_b[1].append(99)

print(list_a)  # [1, [2, 3], 4]
print(list_b)  # [1, [2, 3, 99], 4]

? 結(jié)論:深拷貝創(chuàng)建了一個(gè)完全獨(dú)立的對(duì)象副本,任何修改都不會(huì)相互影響。

五、不同數(shù)據(jù)類型的拷貝行為

數(shù)據(jù)類型淺拷貝結(jié)果深拷貝結(jié)果
int, float, str, bool不可變對(duì)象,直接共享相同效果
list, dict, set復(fù)制容器,但內(nèi)部引用相同完全獨(dú)立副本
tuple如果內(nèi)部包含可變對(duì)象,淺拷貝仍共享引用內(nèi)部對(duì)象獨(dú)立
自定義類對(duì)象可自定義 __copy__ / __deepcopy__ 方法可完全控制復(fù)制邏輯

六、自定義類的拷貝行為

Python 允許開發(fā)者通過實(shí)現(xiàn)特殊方法 __copy____deepcopy__ 來控制類的復(fù)制方式。

示例:

import copy

class Person:
    def __init__(self, name, hobbies):
        self.name = name
        self.hobbies = hobbies

    def __copy__(self):
        print("調(diào)用淺拷貝")
        return type(self)(self.name, self.hobbies)

    def __deepcopy__(self, memo):
        print("調(diào)用深拷貝")
        new_person = type(self)(self.name, copy.deepcopy(self.hobbies, memo))
        return new_person

p1 = Person("Alice", ["reading", "coding"])
p2 = copy.copy(p1)
p3 = copy.deepcopy(p1)

七、常見坑點(diǎn)總結(jié)

  1. 淺拷貝不會(huì)遞歸復(fù)制內(nèi)部對(duì)象
a = [[1, 2], [3, 4]]
b = copy.copy(a)
b[0].append(99)
print(a)  # [[1, 2, 99], [3, 4]]
  1. 不可變對(duì)象(如 int, str, tuple)無需擔(dān)心淺拷貝問題
a = (1, 2, 3)
b = copy.copy(a)
print(a is b)  # True
  1. 深拷貝性能開銷較大
    深拷貝會(huì)遞歸復(fù)制所有內(nèi)容,對(duì)于嵌套層級(jí)深或?qū)ο髲?fù)雜的結(jié)構(gòu),速度會(huì)明顯變慢。
    如果不需要完全隔離,優(yōu)先使用淺拷貝。

八、總結(jié)

概念是否創(chuàng)建新對(duì)象是否遞歸復(fù)制適用場景
賦值(=兩變量共享同一對(duì)象
淺拷貝(copy.copy()僅需復(fù)制一層結(jié)構(gòu)
深拷貝(copy.deepcopy()需要完全獨(dú)立的副本

九、實(shí)踐建議

  • 若僅修改外層容器,用 copy.copy() 即可。
  • 若修改嵌套結(jié)構(gòu)(如列表中包含列表),用 copy.deepcopy()。
  • 若對(duì)象復(fù)雜,考慮自行實(shí)現(xiàn) __copy____deepcopy__,以提升性能與控制力。

? 淺拷貝復(fù)制外殼,深拷貝復(fù)制靈魂。

到此這篇關(guān)于Python中copy() 函數(shù)淺拷貝與深拷貝的文章就介紹到這了,更多相關(guān)Python中copy()函數(shù)淺拷貝深拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)

    Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)

    使用urllib2模塊進(jìn)行基于url的HTTP請(qǐng)求等操作大家也許都比較熟悉,這里我們?cè)偕钊雭砹私庖幌聈rllib2針對(duì)HTTP的異常處理相關(guān)功能,一起來看一下Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié):
    2016-07-07
  • Python實(shí)現(xiàn)的多線程http壓力測試代碼

    Python實(shí)現(xiàn)的多線程http壓力測試代碼

    這篇文章主要介紹了Python實(shí)現(xiàn)的多線程http壓力測試代碼,結(jié)合實(shí)例形式分析了Python多線程操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • Python?包管理器pip入門教程

    Python?包管理器pip入門教程

    這篇文章主要為大家介紹了Python?pip包管理器入門教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 遷移現(xiàn)有的python項(xiàng)目到pyproject.toml

    遷移現(xiàn)有的python項(xiàng)目到pyproject.toml

    本文將詳細(xì)介紹將現(xiàn)有的?Python?項(xiàng)目遷移到?pyproject.toml,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • python設(shè)置Pyplot的動(dòng)態(tài)rc參數(shù)、繪圖的填充

    python設(shè)置Pyplot的動(dòng)態(tài)rc參數(shù)、繪圖的填充

    本文主要介紹了python設(shè)置Pyplot的動(dòng)態(tài)rc參數(shù)、繪圖的填充,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Jupyter notebook如何修改平臺(tái)字體

    Jupyter notebook如何修改平臺(tái)字體

    這篇文章主要介紹了Jupyter notebook如何修改平臺(tái)字體,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python利用selenium建立代理ip池訪問網(wǎng)站的全過程

    Python利用selenium建立代理ip池訪問網(wǎng)站的全過程

    selenium控制瀏覽器也是可以使用代理ip的,下面這篇文章主要給大家介紹了關(guān)于Python利用selenium建立代理ip池訪問網(wǎng)站的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Python編譯結(jié)果之code對(duì)象與pyc文件詳解

    Python編譯結(jié)果之code對(duì)象與pyc文件詳解

    今天小編就為大家分享一篇對(duì)Python編譯結(jié)果之code對(duì)象與pyc文件的詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-10-10
  • flask上使用websocket的方法示例

    flask上使用websocket的方法示例

    本文主要介紹了flask上使用websocket的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • python數(shù)字圖像處理之基本形態(tài)學(xué)濾波

    python數(shù)字圖像處理之基本形態(tài)學(xué)濾波

    這篇文章主要為大家介紹了python數(shù)字圖像處理之基本形態(tài)學(xué)濾波示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論