3

重複の可能性:
Python: なぜ (“hello” is “hello”)?

['hello'] is ['hello']    # gives False

なんで?それらの ID は異なります。タプルや数値が False を返さないのはなぜですか?

4

3 に答える 3

11

以下を考慮してください (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

abは 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']

abは同じオブジェクト ( ) を参照する名前であるためid(a) == id(b)です。最後に、あなたが得たとしてもそれを示すために

>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False

文字列は引き続きインターンされ、一度だけ保存されます。

>>> id(a[0])
33846096L
>>> id(b[0])
33846096L
于 2012-10-09T07:26:43.337 に答える
8

演算子は、is2つのオブジェクト参照が同じオブジェクトを参照しているかどうかをテストします(これは等式演算子ではなく、恒等演算子です)。あなたの例では、2つの別々のリストを作成したため、2つの異なるオブジェクトがあり、それがFalse返される理由です。

于 2012-10-09T07:08:44.880 に答える
1

構文を使用してリストを作成する[]と、新しいリストオブジェクトが作成されます。リストは変更可能なオブジェクトであるため、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
于 2012-10-09T07:21:46.587 に答える