Python的淺拷貝和深拷貝

總結(jié)

本文介紹了對象的賦值和拷貝,以及它們之間的差異:

  • Python中對象的賦值都是進行對象引用(內(nèi)存地址)傳遞
  • 使用copy.copy(),可以進行對象的淺拷貝,它復制了對象,但對于對象中的元素,依然使用原始的引用.
  • 如果需要復制一個容器對象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()進行深拷貝
  • 對于非容器類型(如數(shù)字、字符串、和其他’原子’類型的對象)沒有被拷貝一說
  • 如果元祖變量只包含原子類型對象,則不能深拷貝,看下面的例子

參考:圖解 Python 深拷貝和淺拷貝

1:對象的賦值

Python中,對象的賦值都是進行對象引用(內(nèi)存地址)傳遞

will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = will

由于will和wilber指向同一個對象,所以對will的任何修改都會體現(xiàn)在wilber上

2:淺拷貝

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.copy(will)

淺拷貝會創(chuàng)建一個新的對象,這個例子中”wilber is not will”
但是,對于對象中的元素,淺拷貝就只會使用原始元素的引用(內(nèi)存地址),也就是說”wilber[i] is will[i]”

當我們使用下面的操作的時候,會產(chǎn)生淺拷貝的效果:

使用切片[:]操作
使用工廠函數(shù)(如list/dir/set)
使用copy模塊中的copy()函數(shù)

3:深拷貝

跟淺拷貝類似,深拷貝也會創(chuàng)建一個新的對象,這個例子中”wilber is not will”
但是,對于對象中的元素,深拷貝都會重新生成一份(有特殊情況,下面會說明),而不是簡單的使用原始元素的引用(內(nèi)存地址)

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.deepcopy(will)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • is 和 ==什么區(qū)別? 在Python中 is 是用來判斷兩個對象的內(nèi)存地址是否一樣,而 == 號是判斷兩個對象...
    夢云之巔閱讀 342評論 1 2
  • 在之前的一篇文章中,我們解釋了一下為什么下面的兩種方式是不同的: 第一種生成的bucket中每個list都是不同的...
    文哥的學習日記閱讀 1,227評論 0 3
  • 個人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,948評論 0 5
  • 之前都是想看啥源碼就直接搜grepcode上面的看看。最近閑了,就在看tcp ip相關,想著從user層一步步怎么...
    canezk閱讀 1,786評論 0 0
  • 今天深切的領悟到一些原則上的問題,一旦投機,便會害了自己的一生
    echocorner閱讀 214評論 0 0

友情鏈接更多精彩內(nèi)容