2

「==」の代わりに?私は「何であるか」を知っています、それは変数のアイデンティティを比較しています。しかし、いつそれをやりたいと思いますか?それが私のためにしたことは、問題を引き起こすことだけです。しばらく使用した後(コードが読みやすくなったと感じたため)、「is」に対する宣戦布告はしていません。

誰かが「==」がしない何かのためにそれを使用しますか?なぜ彼らが'を作らなかったのか理解できません'は'=='と同じです、'そして'は'&&'と同じです。誰かがポインタを欲しがっているなら、彼らはただ「id」と言わなければなりません(x)== id(y) "であり、この混乱はありません。

それは私が理解していないPythonの「落とし穴」の1つであり、多くの初心者をつまずかせます。私がそれが人々をつまずかせると思う理由は、彼らがなぜそれがアイデンティティ比較をするのか理解できないからです。ポイントは何ですか?

編集:素晴らしい答えをありがとう。新しい人が奪うべきことは、「自分が何をしているのかわからない限り、常に「==」を使用する」ことだと思います。

4

2 に答える 2

7

はい、理由があります。

オブジェクトの同一性(「同じオブジェクト」)を比較し、オブジェクトの等価性(「同じ値」)を比較したくない場合。ほとんどの場合==、( object-equality ) が正しい演算子です。(コメントで指摘されているように、私が完全にスキップした些細なケースはx is Noneイディオムです --Noneの唯一の住人ですNoneType。)

object-identity の1 つのケースは、identity-cache/dictionaryです。これは、一部のプロキシまたは「裏返し」の状況で一般的なパターンです。この場合、「類似のオブジェクト」の値を戻したくありません。「同じオブジェクト」の値を戻したいのです。

ハッピーコーディング。


Python でポインターについて考えるのは間違っています。Python の値はオブジェクトであり、各値はそれ自体を表します。つまり、とが同じ objectに評価されるx is y場合にのみ真にxなります。Python でオブジェクトが渡される場合、これと同じ概念が保持されます。つまり、オブジェクト自体が渡されます。参照について考える必要はありません。y

Python はCall-by-Sharing/Call-by-Object-Sharingですが、「公式ドキュメントの場所」に存在する「Call-By-Reference」という用語は、動作を説明するために誤って使用されることがよくあります (おそらく「この用語がしばしば誤って使用されている他の言語からの移行を容易にします)。

于 2011-04-02T20:40:31.597 に答える
4

両者には大きな違いがあります。isオブジェクトの同一性==テストし、同等性をテストします。

次の簡単な例を考えてみましょう。

print [] == []     # True
print [] is []     # False
于 2011-04-02T20:42:19.110 に答える