interningにより、多くの場合、(結果のオブジェクトに) 両者の間に違いはありません。演算子を使用して、2 つの変数が同じオブジェクトを指しているかどうかを確認できます。これは、オブジェクトの実際のメモリ アドレスが同じかどうかを確認するis
演算子とは対照的です。==
>>> a = "foo"
>>> b = a
>>> a is b
True
>>> c = a[:]
>>> a is c
True
インターンは、メモリを節約し、不変オブジェクトの比較を高速化するためのメカニズムであり、次のように機能します。新しい不変オブジェクトを作成する前に、python は同一の不変オブジェクトが既に存在するかどうかを確認します。その場合、既存のオブジェクトへの参照を使用するだけです。不変を変更する方法がないため、害を及ぼすことなくそれを行うことができます。これが、独立して作成された 2 つの文字列でさえ、同じオブジェクトを指している可能性がある理由です。
>>> a = "foo"
>>> b = "foo"
>>> a is b
True
しかしvar2
、 のような可変シーケンシャル オブジェクトである場合、list
はvar2[:]
の浅いコピーにvar2
なるため、一方を変更しても他方には影響しません。
>>> a = list("foo")
>>> a
['f', 'o', 'o']
>>> b = a
>>> b is a
True
>>> c = a[:]
>>> c is a
False
>>> b.pop()
'o'
>>> a
['f', 'o']
>>> b
['f', 'o']
>>> c
['f', 'o', 'o']
全体像については、Ashwini Chaudharys の回答もお読みください。