1."is" 和 "=="的區(qū)別是什么?
== 比較的是變量的值
is 比較的是變量的內(nèi)存地址
例如 :
a = 1, b = 1
a is b
此時(shí)返回結(jié)果為True
is 比較的是兩個(gè)變量的存儲(chǔ)地址
在python中撩荣,從-5——256的整數(shù)是存放在同一塊內(nèi)存中的项玛,所以當(dāng)我們這樣定義時(shí):
a = 257, b = 257
返回值為False,當(dāng)變量大于256或者小于-5時(shí),返回值就會(huì)從True變?yōu)镕alse
而我們的"=="比較的是兩個(gè)變量的值
所以無(wú)論怎么定義包括字符串在內(nèi),只要值相等爪飘,a == b 的返回值就是True
2.賦值、深拷貝和淺拷貝的區(qū)別是什么拉背?
⑴賦值(assignment)
>>>a = [1,2,3]
>>>b = a
>>>print(id(a), id(b), sep='\n')
139701469405552
139701469405552
在Python中师崎,用一個(gè)變量給另一個(gè)變量賦值,其實(shí)就是給當(dāng)前內(nèi)存中的對(duì)象增加一個(gè)“標(biāo)簽”而已去团。
如上例,通過(guò)使用內(nèi)置函數(shù) id() 穷蛹,可以看出 a 和 b 指向內(nèi)存中同一個(gè)對(duì)象土陪。a is b會(huì)返回 True 。
⑵肴熏、前拷貝和深拷貝(deep copy)
所謂“深拷貝”鬼雀,是指創(chuàng)建一個(gè)新的對(duì)象,然后遞歸的拷貝原對(duì)象所包含的子對(duì)象蛙吏。深拷貝出來(lái)的對(duì)象與原對(duì)象沒(méi)有任何關(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
看了上面的例子鸦做,有人可能會(huì)疑惑:
為什么使用了深拷貝励烦,a和b中元素的id還是一樣呢?
答:這是因?yàn)閷?duì)于不可變對(duì)象泼诱,當(dāng)需要一個(gè)新的對(duì)象時(shí)坛掠,python可能會(huì)返回已經(jīng)存在的某個(gè)類型和值都一致的對(duì)象的引用。而且這種機(jī)制并不會(huì)影響 a 和 b 的相互獨(dú)立性治筒,因?yàn)楫?dāng)兩個(gè)元素指向同一個(gè)不可變對(duì)象時(shí)屉栓,對(duì)其中一個(gè)賦值不會(huì)影響另外一個(gè)。
我們可以用一個(gè)包含可變對(duì)象的列表來(lái)確切地展示“淺拷貝”與“深拷貝”的區(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 的子對(duì)象相同
...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 的子對(duì)象也不同
...print(id(x), id(y))
...
139832578622816 ? ? 139832578621520
139832578622672 ? ? ?139832578518912
139832578623104 ? ? ?139832578623392
從這個(gè)例子中可以清晰地看出淺拷貝與深拷貝地區(qū)別耸袜。