我想下面的一切將評估爲假。有人可以解釋發生了什麼嗎?不可修改的構造函數是否創建新的對象(和新的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
我想下面的一切將評估爲假。有人可以解釋發生了什麼嗎?不可修改的構造函數是否創建新的對象(和新的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
你的第二個行不正確。您通過1
到id
。 (Python允許尾隨參數列表的逗號。)
print((1,) is (1,))
print(id((1,)) == id((1,)))
print('a' is 'a')
print(id('a') == id('a'))
哪些
False
False
True
True
所以從id
和is
匹配的結果。
應當指出的是,is
/id
的結果可以通過實施而變化。
例如,在CPython的2.7,但2 * 2 is 4
2 * 200 is not 400
。對於低整數瓦萊斯,CPython的使用相同的存儲器地址(其是在CPython的id
的結果)。再次,這取決於實施情況。
您構建不可變類型的新實例元組的每個實例。元組的值不能改變,但它們是不同的(儘管相等)實例。
這是可能的,你可以看到interning的結果與在Python,Java的不可變對象,等等。
PEP237狀態:
實例:
>>> 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
不能依賴作爲該對象唯一標籤的不可變對象的實例。它是一個實現細節,可以在不同的版本和實現上有所不同。
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是真的
我一直在使用Python永遠,我從來不知道它允許在參數列表中的尾隨(不試用!)逗號。感謝那! –