2017-03-01 65 views
2

我不認爲這是重複的,因爲我詢問is==的具體情況的比較類型,但請讓我知道,我會刪除該問題。當比較類型/類時,使用'is'運算符而不是'=='運算符是否「安全」?

我知道is運營商蟒蛇真的轉化爲id(type(a))==id(<type>);但到目前爲止,我發現type(a) is <type>似乎給出了可預見的結果。我的問題是,將使用is運營商曾經產生了意想不到的結果(即類似'foo' is str回到False)?或者根本蟒蛇店type班可預見的位置,使is總會產生相同的結果作爲==?在這種情況下,我發現is更具可讀性。

請注意這種情況是如果我是不處理遺傳類/子類(在這種情況下isinstance將是合適的)。

+0

不要以爲is'的'作爲'id'比較。如果「a」和「b」是同一個對象,則「a is b」的計算結果爲「True」。如果這就是你想要的,請繼續使用它。 – user2357112

+1

尤其是,內存位置完全不相關。在除CPython以外的Python實現中,它們甚至可能在表達式中間改變(儘管'id'值不會)。 – user2357112

+0

@ user2357112對不起,我聽說過多個stackoverflow線程中的解釋;我想只在有限的情況下,這些操作是等同的。 –

回答

1

沒有使用is總是做同樣的事情,它比較(在(C)的Python),您提供的對象的地址。沒有重新定義is可能,所以你總是得到相同的行爲。

如果兩個對象ab具有相同的對象的類型,使用type(a) is type(b)總是回報True。相反,如果type(a) is type(b)確保它們的類型匹配。

,另一方面==會導致意外的結果,如果有人來到身邊,並定義了一個__eq__,做無聊的事:

class MetaFoo(type): 
    def __eq__(self, other): 
     return False 

class Foo(metaclass=MetaFoo): 
    pass 

f1, f2 = Foo(), Foo() 

現在:

type(f1) == type(f2) 
False 

但:

type(f1) is type(f2) 
True 

人們不會這樣做,但它是普通的LY。所以type(f1) == type(f2)不保證任何東西(對於非內置的,就是這樣)。

一般而言,如果您關心的是他們完全相同的對象(如註釋中所述),請使用is,如果您在意它們的設計方式與您的行爲方式相同(您期望得到相應的__eq__被執行)使用==

+0

@StefanPochmann地址類型? 'is'(導致'id')不關心你給它什麼,它的行爲方式是一樣的。導致「__eq__」的'=='不關心它是一個實例還是一個類或一個元類,它仍然會有一個奇怪的實現,導致意想不到的結果。也許我誤解了這個問題?我不確定。 –

+3

嗯*問題*是關於類型。以及如何檢查它們。我想他想知道是否有可能對象'a'具有類型't',但'type(a)是''返回'False'。 –

+1

更好但仍然沒有真正回答這個問題,我想。你說*「如果兩個對象a和b具有與他們的類型相同的對象」*但應該討論*「如果兩個對象a和b具有相同的類型」*。 –

相關問題