2017-10-17 16 views
1

私は、リストを持っているls = [0 1 2 3 4]、私は次のことを実行しています:なぜリストはリスト[:]と同じではないのですか?

print(ls is ls[:]) 

私はFalseとして出力を取得しています。なぜ彼らは同じリストではないのですか?両方のバージョンを印刷すると、同じリストが印刷されます。

+3

'ls [:]'は 'ls'の完全なコピーを作るので、それらは同じオブジェクトではありません。 'ls == ls [:]' – alexis

+1

スライシングはコピーを作成します –

+0

なぜリストコピーが同じIDを持たなければならないのですか?次に、同じリストを参照します。 –

答えて

1

[:]は、lsという浅いコピーを作成します。これは、新しいリストの元の参照をlsに破壊します。ただし、ネストされたリストは[:]によって影響を受けないため、copy.deepcopyが必要です。

例:deepcopy

s = [5, 6, 2, 4] 
=>s 
[5, 6, 2, 4] 
new_s = s 
new_s.append(100) 
=>new_s 
[5, 6, 2, 4, 100] 
=>s 
[5, 6, 2, 4, 100] 

使用:

s = [5, 6, [5, 6, 2, 4], 4] 
new_s = s[:] 
new_s[2].append(45) 
=>s 
[5, 6, [5, 6, 2, 4, 45], 4] #both sublists are still being referenced 
=>new_s 
[5, 6, [5, 6, 2, 4, 45], 4] 
import copy 
s1 = [5, 6, [5, 6, 2, 4], 4] 
new_s1 = copy.deepcopy(s1) 
new_s1[2].append(100) 
=>new_s1 
[5, 6, [5, 6, 2, 4, 100], 4] 
=>s1 
[5, 6, [5, 6, 2, 4], 4] 
+0

私はこの例が最も単純なものではないと思います。 – Adirio

6

lsメモリ内のオブジェクトを参照します。 ls[:]は、新しいlistオブジェクトを作成します。

>>> ls = [0, 1, 2, 3, 4] 
>>> new_ls = ls[:] 
>>> id(ls) == id(new_ls) 
False 
>>> id(ls[0]) == id(new_ls[0]) 
True 
+1

'id(ls [0])== id(0)'に注意してください。スピードとメモリの使用を改善するために、Pythonの実装では、数値が小さいほどシングルトンです。 – Adirio

+0

私はそれが当然のことではないと思いますが、結果を変更することなく 'ls = [object()、object()、object()、object()、object()] 。 '[0、0、0、0、0]'が5つの別個の参照のリストであると期待していれば、より大きな問題になります。 – chepner

+0

右、それを指摘してください。 – Adirio

2

これは、基本的にはあなたがちょうどdidntはそれを知っている

String comparison in Python: is vs. ==

の複製です。

==is 2つの異なることを確認してください。

== asksはこれらの2つの値が同じ値です。

is asksこれらの2つのことは同じもの、つまり同じオブジェクトです。

a[:]は、同じ値を持つ新しいリストを作成するリストをコピーします。これ

a == a[:] 
>> True 

a is a[:] 
>> False 
1

[:]は、あなたの反復可能なオブジェクトの簡易コピーを作成し、リスト(最後まで開始からスライス)のスライスを示しています。 をリストa = [1]を作成し、b = aを行うと、ここであなたは、単に同じメモリアドレス

>>> a = [1,2] 
>>> b = a 
>>> id(a) 
140177107790232 
>>> id(b) 
140177107790232 
>>> b.remove(1) 
>>> a 
[2] 

oをここでAとの両方のB点Bまでの名前を再割り当てされている。しかし、あなたがスライシングでそれを行う場合:さらに実証するために :

>>> a = [1,2] 
>>> b = a[:] 
>>> id(a) 
140177107873232 
>>> id(b) 
140177107873304 
>>> b.remove(1) 
>>> a 
[1, 2] 
>>> 
関連する問題