私は、リストを持っているls = [0 1 2 3 4]
、私は次のことを実行しています:なぜリストはリスト[:]と同じではないのですか?
print(ls is ls[:])
私はFalse
として出力を取得しています。なぜ彼らは同じリストではないのですか?両方のバージョンを印刷すると、同じリストが印刷されます。
私は、リストを持っているls = [0 1 2 3 4]
、私は次のことを実行しています:なぜリストはリスト[:]と同じではないのですか?
print(ls is ls[:])
私はFalse
として出力を取得しています。なぜ彼らは同じリストではないのですか?両方のバージョンを印刷すると、同じリストが印刷されます。
[:]
は、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]
私はこの例が最も単純なものではないと思います。 – Adirio
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
これは、基本的にはあなたがちょうどdidntはそれを知っている
String comparison in Python: is vs. ==
の複製です。
==
とis
2つの異なることを確認してください。
==
asksはこれらの2つの値が同じ値です。
is
asksこれらの2つのことは同じもの、つまり同じオブジェクトです。
a[:]
は、同じ値を持つ新しいリストを作成するリストをコピーします。これ
a == a[:]
>> True
a is a[:]
>> False
[:]
は、あなたの反復可能なオブジェクトの簡易コピーを作成し、リスト(最後まで開始からスライス)のスライスを示しています。 をリスト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]
>>>
'ls [:]'は 'ls'の完全なコピーを作るので、それらは同じオブジェクトではありません。 'ls == ls [:]' – alexis
スライシングはコピーを作成します –
なぜリストコピーが同じIDを持たなければならないのですか?次に、同じリストを参照します。 –