copy - Python list コピー スライス - 割り当て後にリストが突然変更されてしまいました。これを防ぐためにクローンやコピーをするにはどうしたらいいですか?

python list コピー 値渡し / python / list / clone

new_list = my_list を使用している間、 new_list を変更すると、 my_list は毎回変更されます。これはなぜですか。リストを複製またはコピーして、それを防ぐにはどうすればよいですか。

John Kugelman



Answer #1

では、2つのリストがあったとします。

list_1=['01','98']
list_2=[['01','98']]
copy=list_1
print(id(copy))
print(id(list_1))

出力されます。

4329485320
4329485320

そのため、コピーしたリストを変更しようとすると、元のリストも変更されてしまいます。リストは1つしかないので、コピーしたリストから行っても、元のリストから行っても、そのリストは変更されてしまいます。

copy[0]="modify"

print(copy)
print(list_1)
['modify', '98']
['modify', '98']

それでは、リストをコピーするためのpythonicな方法に移りましょう。

copy_1=list_1[:]

この方法は、私たちが最初に抱えていた問題を解決するものです。

print(id(copy_1))
print(id(list_1))

4338792136
4338791432

では、このリストを修正してみて、先ほどの問題が解決するかどうかを見てみましょう。

copy_1[0]="modify"

print(list_1)
print(copy_1)
['01', '98']
['modify', '98']

これで終わりだと思いますか?いいえ、入れ子になったリストをコピーしてみましょう。

copy_2=list_2[:]
print(id((list_2)),id(copy_2))

出力を得ます。

4330403592 4330403528

ここで、両方のリストが別のオブジェクトを指していると考えられますので、今度はそれを修正してみて、私たちが望むものを提供しているかどうかを見てみましょう。

copy_2[0][1]="modify"

print(list_2,copy_2)

これにより、出力が得られます。

[['01', 'modify']] [['01', 'modify']]

そうすると

copy_2=list_2[:]
print(id(copy_2[0]))
print(id(list_2[0]))
4329485832
4329485832
from copy import deepcopy
deep=deepcopy(list_2)

これを確認しましょう。

print(id((list_2)),id(deep))

4322146056 4322148040

外側のリストは両方とも異なるIDを持っているので、内側の入れ子になったリストで試してみましょう。

print(id(deep[0]))
print(id(list_2[0]))
4322145992
4322145800

では、入れ子になったリストを修正してみて、先ほどの問題が解決したかどうかを確認してみましょう。

deep[0][1]="modify"
print(list_2,deep)

出力します。

[['01', '98']] [['01', 'modify']]