2012-01-18 7 views
2

可能性の重複:はPythonでオペレータである

>>> a = "1234" 
>>> b = "1234" 
>>> a is b 
True 
>>> a = "12 34" 
>>> b = "12 34" 
>>> a is b 
False 

は、誰も私を説明できます:
Python “is” operator behaves unexpectedly with integers
How is the 'is' keyword implemented in Python?

私が疑問を持っている

Pythonで、オペレータが "あります"それはなぜそうですか?また、私は理解できません、それは ""演算子はオブジェクトのメモリアドレスだけを比較する必要があると言われて、表現 "aはb"は本当ですか?

+1

これは、ここでかなり詳細に答えています:http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers – Yuushi

+0

ここで別のです[http:// stackoverflow。 com/questions/2987958/how-is-the-is-in-python](http://stackoverflow.com/questions/2987958/how-is-the-is-keyword-implemented-in-python ) – Matt

答えて

3

isは、等価演算子ではありません。 2つの変数が同じオブジェクトを参照しているかどうかを確認します。あなたがこれを行うにした場合:

a = "12 34' 
b = a 

彼らは同じオブジェクトを参照するので、その後a is bは、Trueだろう。

あなたが提示したケースは、Pythonインタプリタの実装の詳細によるものです。文字列は不変であるため、同じ文字列の2つを作成すると同じオブジェクトへの参照が生成されることがあります。つまり、最初のケースでは、Pythonインタプリタは"1234"という単一のコピーを作成し、abは、オブジェクト。後者の場合、インタプリタは2つのコピーを作成します。これは、インタープリタが文字列を作成して処理する方法が原因で、実装の詳細としては信頼できません。 docsから

1

オペレータis及びオブジェクトIDのis not試験:x is yが真である場合にのみ、xおよびyが同じオブジェクトですか。 x is not yは、逆の真理値をもたらす。

id機能は、ここでの違いを示している:2つのオブジェクトが同じである場合

>>> a = "1234" 
>>> b = "1234" 
>>> a is b 
True 
>>> id(a) 
140340938833512 
>>> id(b) 
140340938833512 

>>> a = "12 34" 
>>> b = "12 34" 
>>> a is b 
False 
>>> id(a) 
140340938833568 
>>> id(b) 
140340938833624 
1

isオペレータが識別するために使用されている - すなわち:内部的に、それらが同じメモリ位置に格納されます。

Pythonの実装では、文字列、整数、その​​他の数値などの変更不可能なオブジェクトを自由に最適化することができるため、同一のオブジェクトをインスタンス化するときに以前のものが再利用されます。例えば、cPython(標準実装)では、最初の整数 "n"(実際の閾値は覚えていません)は常にメモリ内の単一のインスタンスとして保持されるため、小さな整数の場合 "is"は常に "True" 。

もちろん、isオペレータはを意味しません。をこの方法で使用してください。文字列や整数が内部的にキャッシュされているかどうかは気にしてはいけません(組み込み関数でも - intern - インタープリタにこのように文字列やオブジェクトをキャッシュさせるヒントがあります)。

isを使用するアイデアは、あるオブジェクトが実際に別の場所に表示されているものと同じものかどうかを確認することです。オブジェクトが等しいかどうかを一貫して検証するには、は常にで等価演算子==を使用する必要があります。