2016-10-21 11 views
3

私は、初心者からPythonまでの初心者ですから、なぜ次のような状況が起こるのか教えてください。 次のコードを考えてみましょう:あなたは上記のコードから見ることができるように、私はなぜprint id(A[0]) == id(B[0])最初の1にevalutes Trueが、私はどちらかの変更反対、リストAをスライスし、Bにコピーしますが、Pythonスライスは同じID位置を示します

>>> A = [1, 2, 3, 4] 
>>> B = A[0:2] 
>>> print id(A) == id(B) 
False 
>>> print id(A[0]) == id(B[0]) 
True        #Why? 
>>> A[0] = 9 
>>> A 
[9, 2, 3, 4] 
>>> B 
[1, 2] 
>>> print id(A[0]) == id(B[0]) 
False        #Contradiction? 

をAまたはBの価値の?

+1

[CPythonキャッシュの小さい整数](http://stackoverflow.com/questions/306313/is-operator-behaves-beex-withexpectedly-with-integers)です。したがって、-5〜256の値はいつでも同じIDになりますそれを確認してください。 –

+0

http://stackoverflow.com/questions/28329498/why-does-a-space-affect-the-identity-comparison-of-equal-strings/28329522#28329522 –

答えて

2

B = A[0:2]を実行すると、基本的にこれの一部として、B[0] = A[0]が実行されます。したがって、A[0]にあるオブジェクト(整数1)は、B[0]にある同じオブジェクトです。

A[0] = 9を設定すると、これらのオブジェクトの長さは同じになりません。

また、@ŁukaszRogalskiはCPythonが小さな整数をキャッシュすることを指摘しました。したがって、A[0] == 1 == B[0]id(1) == id(1)があります。

A[0] == 9の場合、9 != 1 == B[0]およびid(9) != id(1)です。

+0

ああ、それはメモリの場所とは関係ありません? –

+0

https://docs.python.org/2/library/functions.html#id CPythonの場合は、メモリの場所になります。しかし、そうでなければ、ユニークなオブジェクトのためにユニークであることが保証されているだけです。 –

+0

また、私の答えは少しオフです。私がそれを調整している間、ハングアップします。 @Burak。 –

2

これを試してみてください:

id(1) == id(1) #True 

理由は、これらの数定数は、プログラム全体で再利用されるということです。だから、そのメモリのようにいくつかのメモリがストア1に与えられ、プログラム内で1が言及されると、同じメモリが使用されるので、そのメモリへの参照だけが作成されます。オブジェクトは同じままです。

+0

ああ、私は当初はいつもメモリの場所を取り出すと思っていました実際の値よりも:) –

+0

あなたのケースでは、AとBが異なることを指していることを確かめてください。 – Shasha99

+0

@Burakですが、pythonはリテラル整数ごとに1つのオブジェクトしか保存しません。 – Aaron

1

基本的に、pythonはコピー/スライスするたびにリスト内のすべてのアイテムから新しいオブジェクトを作成しません。

しかし、これは不変オブジェクトとのトラブルが発生することはありませんが、あなたが変更可能なオブジェクトには注意する必要があります:あなたは、スライスの新しいオブジェクトを作成するためにcopy.deepcopyを使用することができます。この場合

In [22]: A = [[1, 2], 2, 3, 4] 

In [23]: B = A[0:2] 

In [24]: id(A[0]) == id(B[0]) 
Out[24]: True 

In [27]: A[0][1] = 99 

In [28]: B 
Out[28]: [[1, 99], 2] 

In [32]: import copy 

In [33]: B = copy.deepcopy(A[0:2]) 

In [34]: A[0][1] = 5 

In [35]: B 
Out[35]: [[1, 99], 2] 

In [36]: id(A[0]) == id(B[0]) 
Out[36]: False 
     ^
     New Object 
関連する問題