Python——"is" , "==" and "深淺copy"

1."is" 和 "=="的區(qū)別是什么?

== 比較的是變量的值

is 比較的是變量的內(nèi)存地址

例如 :

a = 1, b = 1

a is b

此時返回結(jié)果為True

is 比較的是兩個變量的存儲地址

在python中,從-5——256的整數(shù)是存放在同一塊內(nèi)存中的,所以當我們這樣定義時:

a = 257, b = 257

返回值為False,當變量大于256或者小于-5時,返回值就會從True變?yōu)镕alse

而我們的"=="比較的是兩個變量的值

所以無論怎么定義包括字符串在內(nèi),只要值相等,a == b 的返回值就是True


2.賦值、深拷貝和淺拷貝的區(qū)別是什么?

⑴賦值(assignment)

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

>>>b = a

>>>print(id(a), id(b), sep='\n')

139701469405552

139701469405552

在Python中,用一個變量給另一個變量賦值,其實就是給當前內(nèi)存中的對象增加一個“標簽”而已。

如上例,通過使用內(nèi)置函數(shù) id() ,可以看出 a 和 b 指向內(nèi)存中同一個對象。a is b會返回 True 。

⑵、前拷貝和深拷貝(deep copy)

所謂“深拷貝”,是指創(chuàng)建一個新的對象,然后遞歸的拷貝原對象所包含的子對象。深拷貝出來的對象與原對象沒有任何關(guān)聯(lián)。

深拷貝只有一種方式:copy模塊中的deepcopy函數(shù)。

>>> import copy

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

>>>b= copy.deepcopy(a)

>>>print(id(a),id(b))

140601785065840 ? ?140601785066200

>>>for x, y in zip(a,b):

?...print(id(x),id(y))

...

140601911441984 ? ? ? 140601911441984

140601911442016 ? ? ??140601911442016

140601911442048 ? ? ??140601911442048

看了上面的例子,有人可能會疑惑:

為什么使用了深拷貝,a和b中元素的id還是一樣呢?

答:這是因為對于不可變對象,當需要一個新的對象時,python可能會返回已經(jīng)存在的某個類型和值都一致的對象的引用。而且這種機制并不會影響 a 和 b 的相互獨立性,因為當兩個元素指向同一個不可變對象時,對其中一個賦值不會影響另外一個。

我們可以用一個包含可變對象的列表來確切地展示“淺拷貝”與“深拷貝”的區(qū)別:

>>>importcopy

>>>a = [[1,2],[5,6], [8,9]]

>>>b = copy.copy(a) ?# 淺拷貝得到b

>>>c = copy.deepcopy(a) ?# 深拷貝得到c

>>>print(id(a), id(b)) ?# a 和 b 不同

139832578518984 ? 139832578335520

>>>forx, yinzip(a, b):# a 和 b 的子對象相同

...print(id(x), id(y))

...

139832578622816 ? 139832578622816

139832578622672 ? 139832578622672

139832578623104 ? 139832578623104

>>>print(id(a), id(c)) ?# a 和 c 不同

139832578518984 ? 139832578622456

>>>forx, yinzip(a, c): ?# a 和 c 的子對象也不同

...print(id(x), id(y))

...

139832578622816 ? ? 139832578621520

139832578622672 ? ? ?139832578518912

139832578623104 ? ? ?139832578623392

從這個例子中可以清晰地看出淺拷貝與深拷貝地區(qū)別。

總結(jié):

1、賦值:簡單地拷貝對象的引用,兩個對象的id相同。

2、淺拷貝:創(chuàng)建一個新的組合對象,這個新對象與原對象共享內(nèi)存中的子對象。

3、深拷貝:創(chuàng)建一個新的組合對象,同時遞歸地拷貝所有子對象,新的組合對象與原對象沒有任何關(guān)聯(lián)。雖然實際上會共享不可變的子對象,但不影響它們的相互獨立性。

淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對于數(shù)字、字符串以及其它“原子”類型,沒有拷貝一說,產(chǎn)生的都是原對象的引用。


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ————摘自博客余功鵬

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

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

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