重複の可能性:
Python: なぜ (“hello” is “hello”)?
['hello'] is ['hello'] # gives False
なんで?それらの ID は異なります。タプルや数値が False を返さないのはなぜですか?
重複の可能性:
Python: なぜ (“hello” is “hello”)?
['hello'] is ['hello'] # gives False
なんで?それらの ID は異なります。タプルや数値が False を返さないのはなぜですか?
以下を考慮してください (Python 2.7.3、64 ビット):
>>> a = "Hello"
>>> b = "Hello"
>>> a is b
True
Python は短い文字列'Hello'
をインターンし、一度だけ保存します。これは実装の詳細であり、言語標準によって保証されていません。長い文字列では失敗する可能性があります:
>>> a = "this is a long string"
>>> b = "this is a long string"
>>> a is b
False
これを考慮してください:
>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False
a
とb
は 2 つの異なるオブジェクトです。これは次の方法で確認できますid()
。
>>> id(a)
33826696L
>>> id(b)
33826952L
これは良いことTMです。
>>> a[0] = "Goodbye"
>>> a
['Goodbye']
>>> b
['Hello']
ただし、そうする場合
>>> a = ["Hello"]
>>> b = a
>>> a is b
True
>>> a[0] = "Goodbye"
>>> b
['Goodbye']
a
とb
は同じオブジェクト ( ) を参照する名前であるためid(a) == id(b)
です。最後に、あなたが得たとしてもそれを示すために
>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False
文字列は引き続きインターンされ、一度だけ保存されます。
>>> id(a[0])
33846096L
>>> id(b[0])
33846096L
演算子は、is
2つのオブジェクト参照が同じオブジェクトを参照しているかどうかをテストします(これは等式演算子ではなく、恒等演算子です)。あなたの例では、2つの別々のリストを作成したため、2つの異なるオブジェクトがあり、それがFalse
返される理由です。
構文を使用してリストを作成する[]
と、新しいリストオブジェクトが作成されます。リストは変更可能なオブジェクトであるため、2つのリストに同じ要素が含まれている場合でも、それらは同じオブジェクトではありません。変更メソッドの1つを呼び出してリストを変更しても、実際にはIDは変更されないことがわかります。
In [1]: a = ["hello"]
In [2]: b = ["hello"]
In [3]: id(a)
Out[3]: 4477468112
In [4]: id(b)
Out[4]: 4477467824
In [5]: a.append("world")
In [6]: id(a)
Out[6]: 4477468112