実行するGISTは次のとおりです。「通常の割り当て」を使用して浅いリスト(sub_listではなく、単一の要素のみ)を処理すると、浅いリストを作成してから「通常の割り当て」を使用してこのリストのコピーを作成すると、「副作用」が発生します。 。この「副作用」は、作成されたコピーリストの要素を変更した場合です。元のリストの同じ要素が自動的に変更されるためです。copy
コピー要素を変更しても元のリスト要素は変更されないので、そのときに便利です。
一方、copy
リストを含むリスト(sub_lists)があり、それをdeepcopy
解決する場合にも、「副作用」があります。たとえば、ネストされたリストを含む大きなリスト(sub_lists)を作成し、この大きなリスト(元のリスト)のコピーを作成したとします。「副作用」は、大きなリストのsub_listsを自動的に変更するコピーリストのsub_listsを変更するときに発生します。場合によっては(一部のプロジェクトでは)、大きなリスト(元のリスト)を変更せずにそのままにして、その要素(sub_lists)のコピーを作成するだけです。そのための解決策はdeepcopy
、この「副作用」を処理し、元のコンテンツを変更せずにコピーを作成することです。
と動作の異なる動作はcopy
、deep copy
複合オブジェクト(つまり、リストなどの他のオブジェクトを含むオブジェクト)のみに関係します。
この単純なコード例に示されている違いは次のとおりです。
最初
copy
元のリストとこのリストのコピーを作成して、(浅い)動作を確認してみましょう。
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
それでは、いくつか実行してみましょう print
テストを、元のリストがそのコピーリストと比較してどのように動作するかを見て。
original_listとcopy_listのアドレスが異なります
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
original_listとcopy_listの要素は同じアドレスを持っています
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
original_listとcopy_listのsub_elementsは同じアドレスを持っています
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
original_list要素を変更しても、copy_list要素は変更されません
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
copy_list要素を変更しても、original_list要素は変更されません
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
original_list sub_elementsを変更すると、copy_list sub_elementsが自動的に変更されます
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
copy_list sub_elementsを変更すると、original_list sub_elementsが自動的に変更されます
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
二番目
元のリストとこのリストのコピーを作成する場合deepcopy
と同じことを実行して、動作を確認しますcopy
。
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
次に、いくつかのprint
テストを実行して、元のリストがそのコピーリストと比較してどのように動作するかを見てみましょう。
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_listとcopy_listのアドレスが異なります
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
original_listとcopy_listの要素は同じアドレスを持っています
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
original_listとcopy_listのsub_elementsに異なるアドレスがあります
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
original_list要素を変更しても、copy_list要素は変更されません
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
copy_list要素を変更しても、original_list要素は変更されません
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
original_list sub_elementsを変更しても、copy_list sub_elementsは変更されません
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
copy_list sub_elementsを変更しても、original_list sub_elementsは変更されません
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]