個人Google Fu使我失敗了。 html
在Python中,如下兩個相等測試是否等效? python
n = 5 # Test one. if n == 5: print 'Yay!' # Test two. if n is 5: print 'Yay!'
對於要比較實例的對象( list
說),這是否成立? 緩存
好的,這樣能夠回答個人問題: app
L = [] L.append(1) if L == [1]: print 'Yay!' # Holds true, but... if L is [1]: print 'Yay!' # Doesn't.
所以==
測試值,其中is
看測試是不是同一個對象? 工具
看一下Stack Overflow問題, Python的「 is」運算符在使用整數時表現異常 。 性能
它主要歸結爲「 is
」檢查它們是不是同一對象,而不僅是彼此相等(小於256的數字是特例)。 測試
有一條簡單的經驗法則能夠告訴您什麼時候使用==
或is
。 spa
==
用於價值平等 。 當您想知道兩個對象是否具備相同的值時,請使用它。 is
爲參考平等 。 當您想知道兩個引用是否引用同一對象時,請使用它。 一般,在將某事物與簡單類型進行比較時,一般會檢查值是否相等 ,所以應使用==
。 例如,您的示例的目的多是檢查x是否具備等於2( ==
)的值,而不是x
是否其實是指與2相同的對象。 code
別的東西要注意:由於方式的CPython的參考實現的工做,你會獲得意想不到的和不一致的結果,若是你錯誤地使用is
比較對整數參考平等: htm
>>> a = 500 >>> b = 500 >>> a == b True >>> a is b False
這幾乎是咱們所指望的: a
和b
具備相同的值,可是是不一樣的實體。 可是呢?
>>> c = 200 >>> d = 200 >>> c == d True >>> c is d True
這與先前的結果不一致。 這裏發生了什麼? 事實證實,出於性能緣由,Python的參考實現將-5..256範圍內的整數對象做爲單例實例進行緩存。 這是一個演示此示例:
>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i))); ... 250: True 251: True 252: True 253: True 254: True 255: True 256: True 257: False 258: False 259: False
這是另外一個不使用的明顯緣由is
:當您錯誤地將其用於值相等時,該行爲應由實現決定。
正如約翰·費米內拉(John Feminella)所說,大多數時候,您將使用==和!=,由於您的目標是比較值。 我只想對剩下的時間作些什麼:
NoneType只有一個實例,即None是一個單例。 所以, foo == None
和foo is None
表示相同。 可是, is
測試速度更快,Pythonic約定使用foo is None
。
若是您要對垃圾收集進行自省或處理,或者檢查自定義構建的字符串實習小工具是否正常工做,那麼您可能有foo
的用例是bar
。
True和False也是(如今)單例,可是foo == True
沒有用例,而foo is True
沒有用例foo is True
。
==
肯定兩個值是否相等,而is
肯定兩個對象是否徹底相同且相等。
https://docs.python.org/library/stdtypes.html#comparisons
is
對身份的測試==
對平等的測試
每一個(小的)整數值都映射到單個值,所以,每一個3都是相同且相等的。 這是實現細節,但不是語言規範的一部分