GIST는 다음과 같습니다. "정상 할당"을 사용하는 얕은 목록 (하위 목록, 단일 요소 만)을 처리하면 얕은 목록을 만든 다음 "정상 할당"을 사용하여이 목록의 복사본을 만들면 "부작용"이 발생합니다. . 이 "부작용"은 작성된 사본 목록의 요소를 변경하면 원래 목록의 동일한 요소가 자동으로 변경되기 때문에 발생합니다. 그 때는 copy
복사 요소를 변경할 때 원래 목록 요소를 변경하지 않으므로, 유용합니다.
반면에 copy
목록이 포함 된 목록 (sub_lists)이있을 때 "부작용"도 있습니다 deepcopy
. 예를 들어 중첩 된 목록이있는 큰 목록 (sub_lists)을 작성하고이 큰 목록 (원본 목록)의 사본을 작성하는 경우가 있습니다. 복사 목록의 sub_list를 수정하면 큰 목록의 sub_list가 자동으로 수정 될 때 "부작용"이 발생합니다. 때로는 (일부 프로젝트에서) 큰 목록 (원본 목록)을 수정하지 않고 그대로 유지하려는 경우 원하는 요소 (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]