2015-09-11 60 views
2

我想下面的一切將評估爲假。有人可以解釋發生了什麼嗎?不可修改的構造函數是否創建新的對象(和新的ID)?元組如何具有相同的id和不同的對象?Python的不可變型IDS和是statment

print((1,) is (1,)) 
print(id(1,) == id(1,)) 
print('a' is 'a') 
print(id('a') == id('a')) 

結果:

False 
True 
True 
True 

回答

4

你的第二個行不正確。您通過1id。 (Python允許尾隨參數列表的逗號。)

print((1,) is (1,)) 
print(id((1,)) == id((1,))) 
print('a' is 'a') 
print(id('a') == id('a')) 

哪些

False 
False 
True 
True 

所以從idis匹配的結果。


應當指出的是,is/id的結果可以通過實施而變化。

例如,在CPython的2.7,但2 * 2 is 42 * 200 is not 400。對於低整數瓦萊斯,CPython的使用相同的存儲器地址(其是在CPython的id的結果)。再次,這取決於實施情況。

+0

我一直在使用Python永遠,我從來不知道它允許在參數列表中的尾隨(不試用!)逗號。感謝那! –

0

您構建不可變類型的新實例元組的每個實例。元組的值不能改變,但它們是不同的(儘管相等)實例。

0

這是可能的,你可以看到interning的結果與在Python,Java的不可變對象,等等。

PEP237狀態:

  • 短整型用小的值(通常爲99 (含)之間-1)「實習」 - 每當一個結果具有這樣的值, 現有短整型用相同的值被返回。這是 沒有完成長整數具有相同的值。這種差異 將保持不變。 (由於沒有這個實習的保證,是 是值得商榷的,這是否是一個語義差別 - 但代碼 可能存在使用「是」短整型和 的比較情況,因爲這個實習這樣的代碼來工作可能。如果與長整型使用失敗 )

實例:

>>> x=7 
>>> y=10-3 
>>> z=int('7') 
>>> all(7 is e for e in [x,y,z]) 
True 
>>> map(id, [x,y,z]) 
[140410571769784, 140410571769784, 140410571769784] 

字符串:

>>> s1='abc' 
>>> s2='abc' 
>>> s1 is s2 
True 
>>> id(s1) 
4378429560 
>>> id(s2) 
4378429560 

不能依賴作爲該對象唯一標籤的不可變對象的實例。它是一個實現細節,可以在不同的版本和實現上有所不同。

0
print((1,) is (1,)) 
print(id(1,) == id(1,)) 
print('a' is 'a') 
print(id('a') == id('a')) 

1 - 首先計算結果爲假,因爲2元組是不同的對象

2 - 它的計算結果爲true,因爲id(1,)不承認1,作爲一個元組,但只是作爲一個1,當你有小整數或字符串python做了一個優化,它將2個名字引用到同一個id,所以它不必分配2個不同的空格。它會是假的,如果你有id((1,))從那以後它會認識到它作爲一個元組

3和4 - 他們是出於同樣的原因真的如2是真的