2014-01-31 158 views
4

我想下面的代碼:Python:'is'和'=='有什麼區別?

x = 'asd' 
y = 'asd' 
z = input() #write here string 'asd'. For Python 2.x use raw_input() 
x == y # True. 
x is y # True. 
x == z # True. 
x is z # False. 

爲什麼我們在最後一個表達式假的?

+0

對於小字符串部分:['是''操作符在與空格比較字符串時的行爲有所不同](http://stackoverflow.com/questions/16756699/is-operator-behaves-differently-when-comparing-strings-with-空格) –

+0

我不認爲這是重複的。標題是誤導性的,但我認爲它具體是爲什麼輸入的字符串不一樣。與其他問題一樣,它也不包含空格。 –

+1

這個問題可能稍有不同,但答案是一樣的 - 「is」偶爾可以作爲cpython中的實現細節。涉及投入的事實並不特別特別;外賣應該是永遠不要使用'is'。 – geoffspear

回答

13

is檢查身份a is bTrue iff ab是相同的對象(它們都存儲在相同的存儲器地址中)。

==檢查平等,這通常是由魔術方法__eq__定義 - 即a == bTrue如果a.__eq__(b)True

就你而言,Python特別優化了兩個硬編碼字符串到同一個對象中(因爲字符串是不可變的,所以沒有危險)。由於input()將在運行時創建一個字符串,因此無法進行該優化,因此會創建一個新的字符串對象。

+0

而來的--input()將在運行時創建一個字符串 x = 5 y = int(input())#<< 5 x == y #True x is y #True ! 但是y也是在運行時創建的。 –

2

is檢查對象是否相等,但是如果對象實際上是相同的對象。由於input()總是創建一個新的字符串,因此它永遠不會is另一個字符串。

Python爲所有出現的相同字符串文字創建一個對象,這就是爲什麼xy指向同一個對象。