2017-01-16 454 views
-4

爲什麼ID(一)== ID(b)在ID(X)= ID(Y)在下面的例子:python:爲什麼是id(x)!= id(y)當x和y是具有相等值的列表?

>>> a = 9 
>>> b = 9 
>>> id(a) 
10901176 
>>> id (b) 
10901176 
>>> id(a) == id(b) 
True 
>>> x = [1, 2, 3] 
>>> y = [1, 2, 3] 
>>> id(x) != id(y) 
True 
>>> id(x) 
11428848 
>>> id(y) 
12943768 

從Python 3.6 DOC我得到ID()「返回一個對象的「身份」,這是一個整數,在整個生命週期中保證這個對象是唯一的,並且是不變的,兩個具有非重疊生命期的對象可以擁有相同的id()值。不要向我解釋。有任何想法嗎?

+3

「保證是唯一的」這是否不能清除它? – Moira

+1

因爲您已經創建了兩個單獨的列表。它們包含相同的項目(它們是相同的),但它們不是同一個對象(它們不相同),正如您可以通過變異一個然後查看另一個一樣來判斷。 – jonrsharpe

+0

它指存儲位置'a = 9; b = 5; b + = 4;打印身份證(一),身份證(B)' –

回答

4

的事實,ab整數具有相同的ID就是通過對不可變對象蟒蛇進行存儲優化(不能在,恩的依據:數字是否足夠大,id可以均是不同的)

嘗試更改b的值,您會看到id(b)發生更改。

當然,這與列表不同:不能從存儲優化中受益,因爲它們是可變的:當您更改y時,不希望x發生更改。

+2

這甚至不適用於* all *不可變對象; CPython爲-5到257(或多或少)預分配'int'對象。此範圍外的int,或其他不可變對象不保證重用相同的對象。 – chepner

+0

@chepner:是的,我已經在我的回答中提到過。比較ids以檢查是否相等(或使用「is」)是不可靠的。 –

+0

謝謝,這有幫助 – tealowpillow

相關問題