6

重複の可能性:
Pythonでの文字列比較:is vs. ==
Python文字列インターン
「==」または「is」のいずれかを使用してPythonで文字列を比較すると、異なる結果が生成されることがあるのはなぜですか?

偶然is==文字列を同じ意味で使用しましたが、必ずしも同じではないことを発見しました。

>>> Folder = "locales/"
>>> Folder2 = "locales/"
>>> Folder is Folder2
False
>>> Folder == Folder2
True
>>> File = "file"
>>> File2 = "file"
>>> File is File2
True
>>> File == File2
True
>>> 

なぜある場合には演算子が交換可能であり、他の場合には交換できないのですか?

4

3 に答える 3

12

短い文字列は効率のためにインターンされているため、同じオブジェクトを参照するため、istrueになります。

これはCPythonでの実装の詳細であり、絶対に信頼することはできません。

于 2012-10-03T09:19:50.347 に答える
4

この質問はそれをさらに明らかにします: Python での文字列比較: is vs. ==

簡単な答えは次のとおりです:==等しい値をisテストし、 (オブジェクト参照を介して)等しい ID をテストします。

Daniel Roseman が確認しているように、同じ値を持つ 2 つの文字列が同じ ID を持つという事実は、Python インタープリターが最適化していることを示唆しています:)

于 2012-10-03T09:23:19.200 に答える
3

==オペレーターは、最初のオブジェクトの内部メソッドを呼び出して、それ__cmp__()を2番目のオブジェクトと比較します。これは、文字列を含むすべてのPythonオブジェクトに当てはまります。オペレーターはオブジェクトのisIDを比較します。

すべてのオブジェクトには、ID、タイプ、および値があります。オブジェクトのIDは、一度作成されると変更されることはありません。これは、メモリ内のオブジェクトのアドレスと考えることができます。'is'演算子は、2つのオブジェクトのIDを比較します。id()関数は、そのIDを表す整数を返します(現在はそのアドレスとして実装されています)。

例えば:

s1 = 'abc'
id(s1) 
>>> 140058541968080
s2 = 'abc'
id(s2)
>>> 140058541968080

# The values the same due to SPECIFIC CPython behvaiour which detects 
# that the value exists in interpreter's memory thus there is no need
# to store it twice. 

s1 is s2
>>> True

s2 = 'cde'
id(s2)
>>> 140058541968040
s1 is s2
>>> False    
于 2012-10-03T09:21:57.213 に答える