2014-10-04 111 views
0

代碼"python" is "python"返回True。但爲什麼(1,2,3) is (1,2,3)返回False?儘管兩者都是不可變的對象,但運算符的計算方式卻有所不同。爲什麼?爲什麼操作員爲不可變對象提供不同的輸出?

+0

'is'與不變性無關。 – simonzack 2014-10-04 08:07:42

+0

第一個例子是你可以在代碼塊中調用常量的本地實習,[編譯器提供](https://hg.python.org/cpython/file/c0e311e010fc/Python/compile.c#l1075)(第1124行;這種情況下的字典是用於構建'co_consts')。這與全局字符串和整數實習是分開的,即不''1 2 3''不被實行,而'1 2 3'爲'1 2 3'。同樣,'1234567是1234567',儘管CPython全球實習人員只能達到256個。此外,'1.23456是1.23456'。 – eryksun 2014-10-04 12:58:05

+0

@eryksun您應該將其寫爲答案 – jonrsharpe 2014-10-04 13:25:16

回答

0

如果兩個操作數引用同一個對象,則返回True。解釋器可以使用實體對象來實現不可變對象,但不能保證。

1

運營商is測試對象標識:x是y爲真當且僅當x和y是相同的對象。 x不是y產生逆真值。

您可以將身份認爲是內存中對象的地址。所以對於具有相同索引的2元組我們有不同的地址! 在這種情況下根據你的解釋和上面的東西,在你的解釋等於字符串指向一個內存地址

爲了更好地理解看到下面的演示:

>>> a=(0,1) 
>>> b=a 
>>> a is b 
True 
>>> c=(0,1) 
>>> a is c 
False 
+0

+1好答案。你可能會繼續解釋它對於可變對象和不可變對象都是一樣的。 – John1024 2014-10-04 08:17:24

+0

因爲它沒有回答這個問題。您的演示不等同於OP的代碼。元組和字符串都是不可變的,爲什麼它們的行爲有所不同? – jonrsharpe 2014-10-04 08:19:09

+0

感謝您的關注,我編輯答案! – Kasramvd 2014-10-04 15:41:21

0

的唯一原因,你的第一個例子是True是從源代碼加載字符串字面值(我認爲這隻適用於單個文件中的字符串甚至)。

幾乎在除字符串文字之外的所有情況下,在不同時間創建的對象將具有不同的ID。

0

如果有任何疑問,X is Y檢查是否XYrefer to the same object。它確實不是檢查兩個對象是否相等。

現在你的問題:

通常你應該沒有關於是否A is A回報TrueFalse對於給定的文字A任何期待。

我們很清楚CPython是如何在內部工作的,所以we can explain爲什麼每個特定情況的行爲方式如此。這就是說,除了在一些真正特殊的情況下,最好把它當作實現細節。在不同的Python解釋器中,或者實際上在不同版本的CPython中,它的行爲可能會有所不同。

當然,這並不意味着is沒有用。這是,只是不是在這種情況下。

相關問題