なぜ() is ()
真であるのに(0,) is (0,)
偽なのか?
同じ物だと思っていました。しかし、どうやら何かが足りないようです。
is
ステートメントの両側が同じメモリアドレスを共有しているかどうかを確認するためのテスト。基本的には略記ですid(a) == id(b)
>>> print id(()), id(())
30085168 30085168
>>> print id((0,)), id((0,))
38560624 38676432
>>>
かなり頻繁に発生するよう()
に、実際にはPythonインタープリターによってシングルトンとして扱われます(0から255までの整数、空の文字列、空のリストなどのように)。インタプリタと比較(0, )
する(0, )
と、実際にはメモリ内の異なる変数です。それらが変更可能である場合、最初の変更を行うことができ、2番目の変更は変更されないため、同じではありません(a is not b
)。
is
平等ではなく、アイデンティティをテストします。つまり、Pythonはオブジェクトが存在するメモリアドレスを単純に比較します。基本的には、「同じオブジェクトに2つの名前がありますか?」という質問に答えます。
通常、Pythonは各タプルを異なるメモリ位置に書き込みます。
インターンは、ほとんどの場合、文字列リテラルに対してのみ発生します。
Dougal がコメントで述べているように、is
比較している 2 つのものがメモリ内の同じ場所にあることをテストします。数値、文字列、ブール値、空のタプルなどの場合、Python はデフォルトでオブジェクトを再利用 (interning) するためis
、多くの場合、 と同じ動作になり==
ます。これは、文字列などのより複雑なデータ型ではなくメモリ ポインターを比較することで、パフォーマンスが向上することも意味します。
あなたの場合のタプル(不変であっても)、リスト、さらには空のリストなどの他のものについては[]
、Pythonは別のメモリ位置に新しいオブジェクトを作成しis
、同じようには機能しません==
2 つのタプルを値で比較しようとしている場合は==
、より良い比較になります。