国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文徹底理解python淺拷貝和深拷貝

這篇具有很好參考價值的文章主要介紹了一文徹底理解python淺拷貝和深拷貝。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、必備知識

  • 萬物皆對象:在學(xué)習(xí)python的深淺拷貝之前我們必須要知道一個事情,就是python對象的引用,在python里面,萬物皆對象,萬物皆對象,萬物皆對象,不管什么數(shù)據(jù)類型都是對象。我們定義一個變量并給這個變量賦值的時候賦的并不是這個對象值,而是這個對象引用,并不是一直值,如a = 1,這個時候并不是把1這個值賦給了a,而是把1這個對象的引用賦值給了a。
  • 可變序列和不可變序列:可變序列就是可以直接對這個序列直接在原地址上進行數(shù)據(jù)修改,如果是不可變序列進行數(shù)據(jù)修改則會創(chuàng)建一個新的對象,讓我這個變量重新指向新的對象。關(guān)于這部分不不懂的小伙伴可以參考下這篇博文:Python的可變類型與不可變類型,如果看完還是有不明白的地方可以評論區(qū)留言。

二、基本概念

  • 淺拷貝:淺拷貝會創(chuàng)建一個新的對象,但這個新對象的內(nèi)可能是院對象的引用或者復(fù)制(視具體數(shù)據(jù)類型而言)。具體來說,如果原對象的元素是可變的(比如列表,字典,集合),淺拷貝會復(fù)制這些元素的引用,而不是元素本身。這意味著新對象和原對象會共享這些可變元素。如果對這些共享的元素進行修改,會影響到原對象。如果原對象的元素是不可變的(比如元組或字符串),淺拷貝則會復(fù)制這些元素的值,因為它們是不可變的,不會影響到原對象。淺拷貝通常有三種方式:自身構(gòu)造器,切片copy.copy()函數(shù),不同數(shù)據(jù)類型(列表,元組,字典,集合 ,字符串)的淺拷貝會有差異,下面會逐一介紹。

  • 深拷貝:重新分配一塊新的內(nèi)存,創(chuàng)建一個新的對象,并將原對象中的元素以遞歸的方式通過創(chuàng)建新的子對象拷貝到新的對象中。新的對象和原對象之間沒有任何關(guān)系。深拷貝使用copy.deepcopy()函數(shù)實現(xiàn)

  • python自帶數(shù)據(jù)類型: 列表,元組,字典,集合,字符串

  • 必備工具網(wǎng)站:pythontutor

三、列表,元組,集合,字符串,字典淺拷貝

3.1 列表

  • 自身構(gòu)造器:
>>> list1 = [1,2,3,4]
>>> list2 = list(list1)
>>> list2
[1, 2, 3, 4]
>>> id(list1)
140495553055488
>>> id(list2)
140495553080256
>>> list1==list2
True
  • 切片
>>> list1 = [1,2,3,4]
>>> list2 = list1[:]
>>> list2
[1, 2, 3, 4]
>>> list1 is list2
False
>>> list1 == list2
True
  • copy()函數(shù)
>>> import copy
>>> list1 = [1,2,3,4]
>>> list2 = copy.copy(list1)
>>> list1
[1, 2, 3, 4]
>>> list2
[1, 2, 3, 4]
>>> list1 is list2
False
>>> list1 == list2
True

注:python中的可變序列有自己的copy()方法,即對于列表和字典這種的對象可以使用list.copy()或者dict.copy()跟copy.copy()函數(shù)是等價的。

  • 總結(jié):python列表可以使用三種方式進行淺拷貝:自身構(gòu)造器,切片,copy()函數(shù)。淺拷貝之后兩個變量的地址不一樣,但是數(shù)值是一樣的,

3.2 元組

  • 自身構(gòu)造器
>>> a = (1,2,3,4)
>>> b = tuple(a)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2, 3, 4)
>>> a is b
True
>>> a == b
True
  • 切片
>>> a = (1,2,3,4)
>>> b = a[:]
>>> a is b
True
>>> a == b
True
>>> a
(1, 2, 3, 4)
>>> b
(1, 2, 3, 4)
  • copy函數(shù)
>>> import copy
>>> a = (1,2,3,4)
>>> b = copy.copy(a)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2, 3, 4)
>>> a is b
True
>>> a == b
True

3.3 集合

  • 自身構(gòu)造器
>>> a = {1,2,3,4}
>>> b = set(a)
>>> a
{1, 2, 3, 4}
>>> b
{1, 2, 3, 4}
>>> a is b
False
>>> a == b
True
  • copy函數(shù)()
>>> import copy
>>> a = {1,2,3,4}
>>> b = copy.copy(a)
>>> a
{1, 2, 3, 4}
>>> b
{1, 2, 3, 4}
>>> a is b
False
>>> a ==b
True

3.4 字符串

  • 自身構(gòu)造器
>>> a = "1234"
>>> b = str(a)
>>> a
'1234'
>>> b
'1234'
>>> a is b
True
>>> a == b
True
  • 切片
>>> a = "1234"
>>> b = a[:]
>>> a
'1234'
>>> b
'1234'
>>> a is b
True
>>> a == b
True
  • copy()
>>> import copy
>>> a = "1234"
>>> b = copy.copy(a)
>>> a
'1234'
>>> b
'1234'
>>> a is b
True
>>> a ==b
True

3.5 字典

  • 自身構(gòu)造器
>>> dict1 = {"a":1, 1:2}
>>> dict2 = dict(dict1)
>>> dict1
{'a': 1, 1: 2}
>>> dict2
{'a': 1, 1: 2}
>>> dict1 is dict2
False
>>> dict1 == dict2
True
  • copy函數(shù)
>>> import copy
>>> dict1 = {"a":1, 1:2}
>>> dict2 = copy.copy(dict1)
>>> dict1
{'a': 1, 1: 2}
>>> dict2
{'a': 1, 1: 2}
>>> dict1 is dict2
False
>>> dict1 == dict2
True

3.6 特別注意

>>> list1 = [[1, 2], (30, 40)]
>>> list2 = list(list1)
>>> list1.append(100)
>>> list1
[[1, 2], (30, 40), 100]
>>> list2
[[1, 2], (30, 40)]
>>> list1[0].append(3)
>>> list1
[[1, 2, 3], (30, 40), 100]
>>> list2
[[1, 2, 3], (30, 40)]
>>> list1[1] += (50,60)
>>> list1
[[1, 2, 3], (30, 40, 50, 60), 100]
>>> list2
[[1, 2, 3], (30, 40)]
  • 如果是可變類型,淺拷貝之后一個變量改變不會影響到另一個,但是如果是不可變類型,一個改變了會影響到另一個同時改變。

可視化展示

  • 可變類型
list1 = [1,2,[3,4,[5,6]]]
list2 = list(list1)

dict1 = {"a":111, "b":{"c":222, "d":{"e":333}}}
dict2 = dict(dict1)

set1 = {1,2,3,4}
set2 = set(set1)

內(nèi)存指向:
一文徹底理解python淺拷貝和深拷貝,Python,python,算法

  • 可變和不可變
list1 = [1,2,[3,4, [5,6]]]
list2 = list1
list3 = list(list1)
print(id(list1))
print(id(list2))
print(id(list3))


tuple1 = (1,2,(3,4,(5,6)))
tuple2 = tuple(tuple1)
tuple3 = tuple1 + (7,8)
tuple4 = tuple1
tuple5 = tuple1[1:3]
print(id(tuple1))
print(id(tuple2))
print(id(tuple3))


str1 = "12'34'56''"
str2 = str1[1:5]
str3 = str1
str4 = str1[:]
print(id(str1))
print(id(str2))
print(id(str3))
print(id(str4))

a = 135346347458484
b = int(a)
b = 123

輸出:

140007835258880
140007835258880
140007835581440
140007674106368
140007674106368
140007674089280
140007835585072
140007660015344
140007835585072
140007835585072

內(nèi)存指向
一文徹底理解python淺拷貝和深拷貝,Python,python,算法

淺拷貝總結(jié)

  • 可變數(shù)據(jù)類型的淺拷貝就是為新的變量重新分配一塊內(nèi)存空間,和原來變量的內(nèi)存不一樣,但是變量的值是一樣的
  • 不可變數(shù)據(jù)類型不會發(fā)生淺拷貝,只是開辟了內(nèi)存存儲原對象的引用,而不是存儲原對象的子對象的引用。
  • 要與賦值操作區(qū)分,賦值只是把原對象的引用賦值給了新的變量,相當(dāng)于這兩個變量指向同一個對象
  • 淺拷貝只改改變最外面一層的元素不會影響到原始數(shù)據(jù)(也就是最外層的數(shù)據(jù)是復(fù)制),改變內(nèi)層元素則會影響原始數(shù)據(jù)(內(nèi)層數(shù)據(jù)是引用)。
  • 可變類型會重新開辟一段內(nèi)存,最外層元素互不影響,內(nèi)層元素會指向原始的數(shù)據(jù)。不可變類型的數(shù)據(jù)發(fā)生完全淺拷貝(這里為了方便介紹理解成淺拷貝,實際上不可變類型不是淺拷貝,數(shù)據(jù)全部復(fù)制)時,新的變量和原始的變量的地址是一模一樣的,如果是發(fā)生部分數(shù)據(jù)的復(fù)制或者增加數(shù)據(jù)的時候,則會新開辟一段空間。
  • 我們重點關(guān)注可變類型,因為不可變類型即使發(fā)生了淺拷貝或者賦值對我們后續(xù)使用沒有任何影響,因為不可變類型數(shù)據(jù)不能被修改,一旦修改就重新開辟了一個新的內(nèi)存來存儲。

四、列表,元組,集合,字符串,字典深拷貝

可視化展示

  • 代碼
import copy
list1 = [1,2,[3,4, [5,6]]]
list2 = copy.deepcopy(list1)
print(id(list1))
print(id(list2))


tuple1 = (1,2,(3,4,(5,6)))
tuple2 = copy.deepcopy(tuple1)
print(id(tuple1))
print(id(tuple2))

tuple3 = (1,2,[3,4], {"a":1})
tuple4 = tuple(tuple3)
tuple4[2].append(5)
tuple4[3]["a"] = 2

輸出:

140347510384064
140347510378496
140347334201984
140347334201984
  • 可視化
    一文徹底理解python淺拷貝和深拷貝,Python,python,算法

結(jié)論

  • 可變類型深拷貝之后新舊變量地址不一樣,不可變類型不變

  • 元組類型比較特殊, 元組內(nèi)部如果嵌套了 可變類型(list, dict)淺拷貝之后, 內(nèi)部的值修改, 會影響拷貝之后的結(jié)果

  • 補充:函數(shù)傳參的時候不可變類型是值傳遞,可變類型是傳引用文章來源地址http://www.zghlxwxcb.cn/news/detail-733908.html

到了這里,關(guān)于一文徹底理解python淺拷貝和深拷貝的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 簡單理解Python中的深拷貝與淺拷貝

    I. 簡介 深拷貝會遞歸的創(chuàng)建一個完全獨立的對象副本, 包括所有嵌套的對象 ,而淺拷貝只 復(fù)制嵌套對象的引用 ,不復(fù)制嵌套對象本身。 簡單來說就是兩者都對原對象進行了復(fù)制,因此使用is運算符來比較新舊對象時,返回的都是False(都開辟了新的內(nèi)存);兩者區(qū)別在于 對嵌

    2024年02月12日
    瀏覽(19)
  • 淺拷貝和深拷貝的區(qū)別

    1、淺拷貝,指的是重新分配一塊內(nèi)存,創(chuàng)建一個新的對象,但里面的元素是原對象中各個子對象的引用。 2、深拷貝,是指重新分配一塊內(nèi)存,創(chuàng)建一個新的對象,并且將原對象中的元素,以遞歸的方式,通過創(chuàng)建新的子對象拷貝到新對象中。因此,新對象和原對象沒有任何

    2024年02月15日
    瀏覽(19)
  • 原型模式和深拷貝,淺拷貝

    案例引入 克隆羊問題 有一只羊,姓名為tom,年齡為1,顏色為白色,編寫程序創(chuàng)建和tom羊?qū)傩酝耆嗤难颉?傳統(tǒng)方式解決 代碼實現(xiàn) 傳統(tǒng)實現(xiàn)方式分析 1.優(yōu)點是好理解,簡單易操作。 2.缺點進行新對象創(chuàng)建時,總是需要重新獲取原始對象的屬性,如果創(chuàng)建的對象復(fù)雜時,效

    2024年02月09日
    瀏覽(25)
  • 如何實現(xiàn)淺拷貝和深拷貝

    如何實現(xiàn)淺拷貝和深拷貝

    1.Object.assign方法 結(jié)果為: ?2.直接賦值 1.遞歸 輸出結(jié)果為: ?2.json 輸出結(jié)果為: ?

    2024年02月13日
    瀏覽(19)
  • 什么是淺拷貝和深拷貝

    什么是淺拷貝和深拷貝

    javascript 中有不同的方法來復(fù)制對象,那么我們怎樣才能正確地復(fù)制一個對象呢? 本文來介紹一下淺拷貝和深拷貝。 一、什么是淺拷貝(Shallow Copy) 淺拷貝是創(chuàng)建一個新對象,新對象有著原始對象屬性值的一份精確拷貝。如果屬性是基本類型,拷貝的就是基本類型的值,如果屬性

    2024年02月08日
    瀏覽(21)
  • python基礎(chǔ)(5):深入理解 python 中的賦值、引用、拷貝、作用域

    目錄 python基礎(chǔ)(5):深入理解 python 中的賦值、引用、拷貝、作用域 1、先來看個問題吧: 2、引用 VS 拷貝: 3、增強賦值以及共享引用:

    2024年02月08日
    瀏覽(23)
  • js中淺拷貝和深拷貝的區(qū)別

    在JavaScript中,淺拷貝(Shallow Copy)和深拷貝(Deep Copy)是兩種不同的復(fù)制對象的方法,它們之間存在一些重要的區(qū)別。 淺拷貝(Shallow Copy): 淺拷貝只復(fù)制對象的頂層屬性,如果屬性是對象或數(shù)組,則復(fù)制的是引用,而不是實際的對象。這意味著,如果更改了復(fù)制后的對象

    2024年01月20日
    瀏覽(22)
  • 【Python常用函數(shù)】一文讓你徹底掌握Python中的pivot_table函數(shù)

    任何事情都是由量變到質(zhì)變的過程,學(xué)習(xí)Python也不例外。只有把一個語言中的常用函數(shù)了如指掌了,才能在處理問題的過程中得心應(yīng)手,快速地找到最優(yōu)方案。本文和你一起來探索Python中的pivot_table函數(shù),讓你以最短的時間明白這個函數(shù)的原理。也可以利用碎片化的時間鞏固

    2024年02月12日
    瀏覽(19)
  • 【嵌入式系列】一文徹底理解DMA

    【嵌入式系列】一文徹底理解DMA

    DMA用于在 外設(shè) 與 存儲器 之間以及 存儲器 與 存儲器 之間提供高速數(shù)據(jù)傳輸??梢栽跓o需任何 CPU 操作的情況下通過 DMA 快速移動數(shù)據(jù)。這樣節(jié)省的 CPU 資源可供其它操作使用。 我們用一個現(xiàn)實例子來做個類比。有一家冶煉公司,每天要不斷的從礦場拉礦石進入廠區(qū)冶煉,以

    2023年04月19日
    瀏覽(24)
  • java八股文面試[java基礎(chǔ)]——淺拷貝和深拷貝

    java八股文面試[java基礎(chǔ)]——淺拷貝和深拷貝

    ? 自驗證:創(chuàng)建Class Student兩個類, Student中含有Class對象 測試代碼: 輸出: 可以看到不同的Student對象,但是有相同的Class對象 修改Student clone方法: 可以看到不同的class對象,不同的值: 知識來源: 【23版面試突擊】什么是淺拷貝和深拷貝_嗶哩嗶哩_bilibili 強引用、弱引用介

    2024年02月11日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包