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ū)別。