「 ==」和「是」之間有區別嗎?

這篇文章是 社區維基 。 編輯現有答案以改善此職位。 它當前不接受新的答案。

個人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看測試是不是同一個對象? 工具


#1樓

看一下Stack Overflow問題, Python的「 is」運算符在使用整數時表現異常性能

它主要歸結爲「 is 」檢查它們是不是同一對象,而不僅是彼此相等(小於256的數字是特例)。 測試


#2樓

有一條簡單的經驗法則能夠告訴您什麼時候使用==isspa

  • ==用於價值平等 。 當您想知道兩個對象是否具備相同的值時,請使用它。
  • is參考平等 。 當您想知道兩個引用是否引用同一對象時,請使用它。

一般,在將某事物與簡單類型進行比較時,一般會檢查值是否相等 ,所以應使用== 。 例如,您的示例的目的多是檢查x是否具備等於2( == )的值,而不是x是否其實是指與2相同的對象。 code


別的東西要注意:由於方式的CPython的參考實現的工做,你會獲得意想不到的和不一致的結果,若是你錯誤地使用is比較對整數參考平等: htm

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

這幾乎是咱們所指望的: ab具備相同的值,可是是不一樣的實體。 可是呢?

>>> 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 :當您錯誤地將其用於值相等時,該行爲應由實現決定。


#3樓

正如約翰·費米內拉(John Feminella)所說,大多數時候,您將使用==和!=,由於您的目標是比較值。 我只想對剩下的時間作些什麼:

NoneType只有一個實例,即None是一個單例。 所以, foo == Nonefoo is None表示相同。 可是, is測試速度更快,Pythonic約定使用foo is None

若是您要對垃圾收集進行自省或處理,或者檢查自定義構建的字符串實習小工具是否正常工做,那麼您可能有foo的用例是bar

True和False也是(如今)單例,可是foo == True沒有用例,而foo is True沒有用例foo is True


#4樓

==肯定兩個值是否相等,而is肯定兩個對象是否徹底相同且相等。


#5樓

https://docs.python.org/library/stdtypes.html#comparisons

is對身份的測試==對平等的測試

每一個(小的)整數值都映射到單個值,所以,每一個3都是相同且相等的。 這是實現細節,但不是語言規範的一部分

相關文章
相關標籤/搜索