2017-03-01 5 views
2

私はこれが重複しているとは思わないが、is==の具体的なケースのタイプを比較するが、私に教えてください。型/クラスを比較するとき、 '=='演算子の代わりに 'is'演算子を使用するのは安全ですか?

私は、is演算子が実際にはid(type(a))==id(<type>)に変換されていることを知っています。しかし、これまでのところ、私はtype(a) is <type>が予測可能な結果を​​出すように見えた。私の質問は、is演算子を使用すると、予期しない結果が(つまり、'foo' is strが返され、Falseになる)という結果になりますか?または、Pythonはtypeクラスを予測可能な場所に格納するので、isは常に==と同じ結果になりますか?この文脈では、isがやや読みやすくなっています。

このケースは、私がである場合、継承されたクラス/サブクラス(その場合はisinstanceが適しています)を扱っていない場合です。

+0

'id'の比較として' is'を考えないでください。 'a is b 'は' a'と 'b'が同じオブジェクトであれば' True'と評価されます。それがあなたが探しているものなら、それを使ってください。 – user2357112

+1

特に、メモリの場所は完全に無関係です。 CPython以外のPython実装では、式の途中で変更されることもあります(ただし、 'id'値はそうではありません)。 – user2357112

+0

@ user2357112申し訳ありませんが、私は複数のstackoverflowスレッドでその説明を聞いたことがあります。私は限られた状況でしかないと思うが、それらの操作は同等である。 –

答えて

1

いいえ、isは常に同じことを使用して、(C)Pythonで)あなたが提供したオブジェクトのアドレスを比較します。 isの再定義はできませんので、常に同じ動作をします。

二つのオブジェクトabtype(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 

人はそういうことはしませんが、普通のシルまあ。したがってtype(f1) == type(f2)は何も保証しません(非組み込みの場合)。

一般的に、(コメントに記載されているとおり)正確に同じオブジェクトであることを気にしている場合は、同じ方法で動作するように設計されていることを気にしている場合はisを使用します実装するには==を使用します。

+0

@StefanPochmannアドレスタイプ? 'is'(' id'につながります)はあなたが何を与えるか気にしません、同じように動作します。 '=='は '__eq__'につながりますが、それがインスタンスかクラスかメタクラスかどうかは気にしませんが、予期しない結果につながる奇妙な実装が残っている可能性があります。たぶん私はその質問を誤解したでしょうか?よく分かりません。 –

+3

まあ*質問はタイプについてです。そしてそれらをチェックする方法。私は、オブジェクト 'a'が' t'型であるが、型(a)が 't''が' False'を返す可能性があるのか​​疑問に思っています。 –

+1

質問にはまだまだ改善が見られますがあなたは* "二つのオブジェクトaとbがそれらの型と同じオブジェクトを持っているならば" *話すべきです* "もし二つのオブジェクトaとbが同じ型を持っているなら" *。 –

関連する問題