欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的賦值、深拷貝與淺拷貝的區(qū)別詳解

 更新時(shí)間:2020年02月12日 15:20:51   作者:豬笨是念來(lái)過(guò)倒  
這篇文章主要介紹了Python的賦值、深拷貝與淺拷貝的區(qū)別,需要的朋友可以參考下

在python中,給一個(gè)對(duì)象賦值,實(shí)際上就是對(duì)象對(duì)內(nèi)存空間存儲(chǔ)的值的引用。當(dāng)我們把對(duì)象賦值給另一個(gè)變量的時(shí)候,這個(gè)變量并沒(méi)有拷貝這個(gè)對(duì)象,而只是拷貝了這個(gè)對(duì)象的引用而已。

一般情況下我們會(huì)通過(guò)三種方法來(lái)實(shí)現(xiàn)拷貝對(duì)象的引用。

Python直接賦值

直接賦值,默認(rèn)淺拷貝傳遞對(duì)象的引用而已,原始列表改變,被賦值的變量也會(huì)做相同的改變。其實(shí)就是對(duì)‘對(duì)象'的引用

示例:

>>> list_demo = [2, 4, 6]
>>> a = list_demo
>>> print(a)
[2, 4, 6]
>>> id(list_demo)
65006808
>>> id(a)
65006808
>>> list_demo.append(8)
>>> print(list_demo)
[2, 4, 6, 8]
>>> print(a)
[2, 4, 6, 8]
>>> id(list_demo)
65006808
>>> id(a)
65006808
>>>

通過(guò) id() 函數(shù)我們可以得出,變量 list_demo 與 a 指向的都是同一個(gè)內(nèi)存空間地址,當(dāng)被賦值的 list_demo改變,被賦值的 a 同樣會(huì)做相同的改變。這種現(xiàn)象普遍存在于 Python 之中,這種賦值的方式實(shí)現(xiàn)了 “假裝” 拷貝,真實(shí)的情況還是兩個(gè)變量和同一個(gè)對(duì)象之間的引用關(guān)系。

Python淺拷貝

import copy 模塊的 copy.copy() 方法,該方法只拷貝父對(duì)象,沒(méi)有拷貝子對(duì)象。且淺拷貝是創(chuàng)建一塊新的內(nèi)存空間,但是內(nèi)存空間內(nèi)的元素的地址均是父對(duì)象元素的地址的拷貝。所以當(dāng)父對(duì)象內(nèi)部的子對(duì)象發(fā)生改變時(shí),拷貝對(duì)象的內(nèi)部的子對(duì)象也會(huì)跟著改變。

示例:

>>> list_demo1 = [2, 4, 6, [8, 10]]
>>> a = list_demo1
>>> print(list_demo1)
[2, 4, 6, [8, 10]]
>>> print(a)
[2, 4, 6, [8, 10]]
>>>
>>>
>>> import copy
>>> b = copy.copy(list_demo1)
>>> id(list_demo1)
65103472
>>> id(b)
6011200
>>> list_demo1.append(12)
>>> print(list_demo1)
[2, 4, 6, [8, 10], 12]
>>> list_demo1[3]
[8, 10]
>>>
>>>
>>>
>>> list_demo1[3].append('hello')
>>> print(list_demo1)
[2, 4, 6, [8, 10, 'hello'], 12]
>>> print(b)
[2, 4, 6, [8, 10, 'hello']]
>>> list_demo1[3]
[8, 10, 'hello']
>>> b[3]
[8, 10, 'hello']
>>>
>>>
>>>
>>> id(list_demo1)
65103472
>>> id(b)
6011200
>>> id(list_demo1[3])
64679128
>>> id(b[3])
64679128
>>>

從上述代碼可以看出,在執(zhí)行淺拷貝的時(shí)候,淺拷貝實(shí)際上只拷貝引用,不拷貝內(nèi)容。同時(shí),淺拷貝會(huì)針對(duì)父對(duì)象的子對(duì)象進(jìn)行判斷,當(dāng)父對(duì)象的子對(duì)象發(fā)生改變時(shí),拷貝對(duì)象內(nèi)的子對(duì)象同時(shí)也跟著改變。

Python深拷貝

import copy 模塊的 copy.deepcopy() 方法,深拷貝與淺拷貝相反,就是徹徹底底的拷貝,完全的拷貝了父對(duì)象及子對(duì)象,同時(shí)指向一個(gè)新的內(nèi)存空間地址。此時(shí),雖然源對(duì)象與拷貝對(duì)象的內(nèi)容是一樣的,但是不管針對(duì)誰(shuí)進(jìn)行改動(dòng),另一個(gè)是絲毫不會(huì)受到影響的。

>>> list_demo2 = [2,3,4]

>>> c= copy.deepcopy(list_demo2)

>>> print(list_demo2)

[2, 3, 4]

>>> print(c)

[2, 3, 4]

>>> id(list_demo2)

6011440

>>> id(c)

6012440

>>> list_demo2.append(['a','b'])

>>> c.append([5,6])

>>> print(list_demo2)

[2, 3, 4, ['a', 'b']]

>>> print(c)

[2, 3, 4, [5, 6]]

>>> list_demo2[3].append('c')

>>> c[3].append(7)

>>> print(list_demo2)

[2, 3, 4, ['a', 'b', 'c']]

>>> print(c)

[2, 3, 4, [5, 6, 7]]

>>>

從上述代碼示例可以看出 list_demo2 與 c 相互獨(dú)立,無(wú)論 list_demo2 與 c本身進(jìn)行了修改,或者各自的子對(duì)象進(jìn)行了修改 都沒(méi)有互相影響。

總結(jié)

Python賦值

賦值的本質(zhì)就是將一個(gè)對(duì)象的內(nèi)存空間地址賦值給一個(gè)變量,讓變量指向該內(nèi)存空間地址。

Python淺拷貝

淺拷貝是拷貝了源對(duì)象的引用,并創(chuàng)建了一個(gè)新的內(nèi)存空間地址。但是引用的對(duì)象的子對(duì)象的地址仍然是源對(duì)象的,所以當(dāng)源對(duì)象的子對(duì)象發(fā)生改變時(shí),拷貝對(duì)象內(nèi)的子對(duì)象同時(shí)也跟著改變。

Python深拷貝

深拷貝就是徹底的拷貝,完全的拷貝了父對(duì)象及子對(duì)象,同時(shí)指向一個(gè)新的內(nèi)存空間地址。源對(duì)象與拷貝對(duì)象之間的修改互不影響。

更多關(guān)于Python的賦值、深拷貝與淺拷貝的區(qū)別文章請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

最新評(píng)論