1

期待どおりに動作する次のコードがあります。

a = [1, 2, 3, 4]
b = a

>>> b is a
True

少し変更しても、まだ機能します。

a = [1, 2, 3, 4]
b = a[2] * 2

>>> b is a[2] * 2
True

今問題:

a = [1, 2, 3, 4]
b = a * 2

>>> b is a * 2
False    

b is a[2] * 2なぜこれがFalseを返すのにTrueを返すのか、誰か説明してもらえますか?

4

3 に答える 3

4

aがリストの場合a * 2、新しいリスト インスタンスを作成します。2 回呼び出すとa * 2、2 つの新しいリスト インスタンスが作成されます。これがb is a * 2yieldsの理由Falseです。

あなたが得る理由Trueb is a[2] * 2、小さな整数をキャッシュするCPythonの最適化です。Python では整数は不変であるため、実際には新しいインスタンスを取得するかキャッシュされたインスタンスを取得するかは問題ではなく、小さな整数の場合、Python は同じ整数を再度ヒットするとキャッシュされたバージョンを返します。また、試してみてください

>>> a = [1, 2, 300, 4]
>>> b = a[2] * 2
>>> b is a[2] * 2
False
于 2011-03-10T20:45:43.357 に答える
2

同一のリストはis、同じリストを参照しない限り、比較しても同等ではありません。リストの値が同じだからといって、メモリ内の同じリストを参照しているとは限りません。

例えば、

>>> a = [1,2,3]
>>> id(a) # memory location list a references
161267628
>>> b = [1,2,3]
>>> id(b) # memory location list b references, a different memory location than list a
161276396
>>> a == b 
True
>>> a is b
False
>>> c = a # by this method of assignment; c points to the same point that a does;
# hence changes to a and changes to c, will change both.
>>> id(c) # memory location that c references; this is the same as where a points.
161267628
>>> a is c
True
>>> c.append(4)
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3]
>>> print c
[1, 2, 3, 4]
>>> d = a[:] # this just copies the values in a to d.  
>>> id(d)
161277036

これは、それらが異なるメモリ位置を指していることに意味があります。なぜなら、変更せずに最初のリストを変更したい場合 (4末尾に追加するなどa)と、メモリ内の同じ位置を指しているb場合は不可能だからです。ab

于 2011-03-10T20:57:54.223 に答える
0

a * 2 は新しいリストを構築しますが、整数はそれ自体と同一性を持ちます。

>>> type(a[2] * 2)
<type 'int'>
>>> type(a * 2)
<type 'list'>
于 2011-03-10T20:45:23.727 に答える