我想下面的代碼: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.
爲什麼我們在最後一個表達式假的?
我想下面的代碼: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.
爲什麼我們在最後一個表達式假的?
is
檢查身份。 a is b
是True
iff a
和b
是相同的對象(它們都存儲在相同的存儲器地址中)。
==
檢查平等,這通常是由魔術方法__eq__
定義 - 即a == b
是True
如果a.__eq__(b)
是True
。
就你而言,Python特別優化了兩個硬編碼字符串到同一個對象中(因爲字符串是不可變的,所以沒有危險)。由於input()
將在運行時創建一個字符串,因此無法進行該優化,因此會創建一個新的字符串對象。
而來的--input()將在運行時創建一個字符串 x = 5 y = int(input())#<< 5 x == y #True x is y #True ! 但是y也是在運行時創建的。 –
is
檢查對象是否相等,但是如果對象實際上是相同的對象。由於input()
總是創建一個新的字符串,因此它永遠不會is
另一個字符串。
Python爲所有出現的相同字符串文字創建一個對象,這就是爲什麼x
和y
指向同一個對象。
對於小字符串部分:['是''操作符在與空格比較字符串時的行爲有所不同](http://stackoverflow.com/questions/16756699/is-operator-behaves-differently-when-comparing-strings-with-空格) –
我不認爲這是重複的。標題是誤導性的,但我認爲它具體是爲什麼輸入的字符串不一樣。與其他問題一樣,它也不包含空格。 –
這個問題可能稍有不同,但答案是一樣的 - 「is」偶爾可以作爲cpython中的實現細節。涉及投入的事實並不特別特別;外賣應該是永遠不要使用'is'。 – geoffspear