7
    >>>a=[999999,2,3]
    >>>b=[999999,2,3]
    >>>print(a[0] is b[0])
    False#because it works for numbers -5 through 256
    >>>a=[1,2,3]
    >>>b=a[:]
    >>>print(a[0] is b[0])
    True#because it works for numbers -5 through 256
    >>>a=[999999,2,3]
    >>>b=a[:]
    >>>print(a[0] is b[0])
    True#why not False ???

b=a[:] はどうなりますか (-5 から 256 までの数字で機能しないのはなぜですか)?

4

4 に答える 4

11

-5 から 256 の範囲は、のものと関係があります。

現在の実装では、-5 から 256 までのすべての整数に対して整数オブジェクトの配列が保持されますint。その範囲で を作成すると、実際には既存のオブジェクトへの参照が返されます。

これを実証するために、異なる値を返すことができるのにid(123)、同じ値を返し続ける方法に注意してください。id(9999)

In [18]: id(123)
Out[18]: 9421736

In [19]: id(123)
Out[19]: 9421736

In [20]: id(9999)
Out[20]: 9708228

In [21]: id(9999)
Out[21]: 10706060

もちろん、これは現在の実装の成果物です。別の Python 実装ではそれができないか、別の範囲を使用する可能性があります。

あなたの最後の例について:

In [14]: a=[999999, 2, 3]

In [15]: b=a[:]

In [16]: map(id, a)
Out[16]: [10908252, 9421180, 9421168]

In [17]: map(id, b)
Out[17]: [10908252, 9421180, 9421168]

ご覧のとおり[:]、参照をコピーするだけです。これは、for allとa[i] is b[i]評価される理由を説明しています。Truei

于 2012-11-24T07:27:46.940 に答える
5
a = [1,2,3]
b = a

ここでb=aは、b を a のエイリアスにします。つまり、b に対するすべての変更が a に表示されます。

b=a[:]a のコピーを作成し、それを b に割り当てることを意味します。

于 2012-11-24T07:29:40.883 に答える
2
 >>>b=a[:]

リスト a の項目と b をコピーする名前の浅いコピーを作成します。新しいリストに含まれるすべてのアイテムは、元のリストのアイテムと同じオブジェクト ID (ポインターと考えてください) を持ちます。これは予期される動作です。

于 2012-11-24T07:30:12.490 に答える
1

@NPEの答えに加えて、ここに素敵なイラストがあります:

a = range(-7, 259)
b = range(-7, 259)
for x, y in zip(a,b): 
    print x, x is y

プリント:

-7 False
-6 False
-5 True
-4 True
...
255 True
256 True
257 False
258 False
于 2012-11-24T07:51:13.373 に答える