Python - 리스트 복사

안녕하세요, Python 프로그래머를 꿈꾸는 여러분! 오늘, 우리는 Python에서 리스트를 복사하는 흥미로운 세계에 빠지게 될 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 여정을 명확한 설명과 많은 예제, 그리고 길고길이 저는 웃음을 더할 수도 있는 방식으로 안내해 드리겠습니다. 그럼, 시작해보겠습니다!

Python - Copy Lists

Python에서 리스트 복사

다양한 방법으로 리스트를 복사하기 전에, 우리는 먼저 왜 리스트를 복사해야 하는지 이해해야 합니다. 여러분이 쇼핑 목록이 있고, 그것을 방금이에게 공유하고 싶다고 생각해봅시다. 여러분은 그들에게 원래의 목록을 주 수 있지만, 그들이 "초콜릿"을 추가하려고 한다면 어떻게 될까요? 갑자기, 여러분의 주의 깊게 계획한 건강한 쇼핑 목록이 위협받게 됩니다! 이때 복사가 유용하게 사용됩니다.

Python에서, 여러분이 목록을 새 변수에 할당할 때, 새로운 목록을 만들지 않습니다. 대신, 같은 목록에 대한 새로운 참조를 만듭니다. 이를 action에서 확인해보겠습니다:

original_list = [1, 2, 3, 4, 5]
new_list = original_list

print("Original list:", original_list)
print("New list:", new_list)

new_list.append(6)

print("Original list after modification:", original_list)
print("New list after modification:", new_list)

Output:

Original list: [1, 2, 3, 4, 5]
New list: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5, 6]
New list after modification: [1, 2, 3, 4, 5, 6]

놀라셨나요? 두 목록이 모두 메모리에서 같은 목록이기 때문에 변경되었습니다. 이때 복사가 구조를拯救합니다!

Python 목록의 얕은 복사

얕은 복사는 새로운 목록 객체를 만들지만, 새 목록의 요소는 원래 목록의 같은 객체에 대한 참조입니다. 이는 여러분의 쇼핑 목록에 대한 사진 복사를 만드는 것과 같습니다 - 새로운 도화지를 가지고 있지만, 그 위에 쓰여진 항목은 같습니다.

이제 어떻게 얕은 복사를 만드는지 살펴보겠습니다:

import copy

original_list = [1, [2, 3], 4]
shallow_copy = copy.copy(original_list)

print("Original list:", original_list)
print("Shallow copy:", shallow_copy)

shallow_copy[1][0] = 'two'

print("Original list after modification:", original_list)
print("Shallow copy after modification:", shallow_copy)

Output:

Original list: [1, [2, 3], 4]
Shallow copy: [1, [2, 3], 4]
Original list after modification: [1, ['two', 3], 4]
Shallow copy after modification: [1, ['two', 3], 4]

얕은 복사에서 중첩된 목록을 변경하면 원래 목록에도 영향을 미친다는 것에 주목하세요. 이는 중첩된 목록이 여전히 메모리에 있는 같은 객체에 대한 참조인 것 때문입니다.

Python 목록의 깊은 복사

반면, 깊은 복사는 새로운 목록을 만들고 재귀적으로 중첩된 객체의 복사를 추가합니다. 이는 여러분의 쇼핑 목록을 완전히 새로 쓰는 것과 같습니다 - 모든 것이 새로운 것이며 독립적입니다.

이제 어떻게 깊은 복사를 만드는지 살펴보겠습니다:

import copy

original_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)

print("Original list:", original_list)
print("Deep copy:", deep_copy)

deep_copy[1][0] = 'two'

print("Original list after modification:", original_list)
print("Deep copy after modification:", deep_copy)

Output:

Original list: [1, [2, 3], 4]
Deep copy: [1, [2, 3], 4]
Original list after modification: [1, [2, 3], 4]
Deep copy after modification: [1, ['two', 3], 4]

이번에는 깊은 복사를 수정하면 원래 목록에 영향을 주지 않았습니다. 완전히 독립적입니다!

슬라이스 표기법을 사용하여 목록 복사

이제 목록을 복사하는 다른 방법들을 살펴보겠습니다. 가장 쉬운 방법 중 하나는 슬라이스 표기법을 사용하는 것입니다. "여기서부터 끝까지 전체 목록의 복사를 원한다"는 것과 같습니다.

original_list = [1, 2, 3, 4, 5]
slice_copy = original_list[:]

print("Original list:", original_list)
print("Slice copy:", slice_copy)

slice_copy.append(6)

print("Original list after modification:", original_list)
print("Slice copy after modification:", slice_copy)

Output:

Original list: [1, 2, 3, 4, 5]
Slice copy: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5]
Slice copy after modification: [1, 2, 3, 4, 5, 6]

이 방법은 목록의 얕은 복사를 만듭니다, 이는 보통 숫자와 문자열과 같은 불변 객체들로 구성된 목록에는 충분합니다.

list() 함수를 사용하여 목록 복사

목록을 복사하는 또 다른 방법은 list() 함수를 사용하는 것입니다. Python에게 "이것과 같은 새로운 목록을 만들어 주세요"라고 말하는 것과 같습니다.

original_list = [1, 2, 3, 4, 5]
list_copy = list(original_list)

print("Original list:", original_list)
print("List copy:", list_copy)

list_copy.append(6)

print("Original list after modification:", original_list)
print("List copy after modification:", list_copy)

Output:

Original list: [1, 2, 3, 4, 5]
List copy: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5]
List copy after modification: [1, 2, 3, 4, 5, 6]

이 방법도 목록의 얕은 복사를 만듭니다.

copy() 함수를 사용하여 목록 복사

마지막으로, copy() 메서드를 사용하는 방법입니다. 이는 목록의 내장 메서드입니다. "여기, 나 자신의 복사를 가져가세요!"라고 목록이 말하는 것과 같습니다.

original_list = [1, 2, 3, 4, 5]
copy_method = original_list.copy()

print("Original list:", original_list)
print("Copy method:", copy_method)

copy_method.append(6)

print("Original list after modification:", original_list)
print("Copy method after modification:", copy_method)

Output:

Original list: [1, 2, 3, 4, 5]
Copy method: [1, 2, 3, 4, 5]
Original list after modification: [1, 2, 3, 4, 5]
Copy method after modification: [1, 2, 3, 4, 5, 6]

이 방법도 목록의 얕은 복사를 만듭니다.

이제, 이 모든 방법을 손쉽게 정리한 표를 안내해 드리겠습니다:

Method Syntax Type of Copy Notes
Assignment new_list = original_list Reference True copy가 아님
Shallow Copy copy.copy(original_list) Shallow 새로운 목록, 같은 객체 참조
Deep Copy copy.deepcopy(original_list) Deep 새로운 목록, 새로운 객체 참조
Slice Notation original_list[:] Shallow 쉬워서 가독성 좋음
list() Function list(original_list) Shallow 명확한 의도
copy() Method original_list.copy() Shallow 목록 내장 메서드

기억해주세요, 올바른 복사 방법을 선택하는 것은 여러분의 특정 필요에 따라 다릅니다. 불변 객체들로 구성된 간단한 목록의 경우, 얕은 복사는 보통 충분합니다. 하지만 중첩된 목록이나 가변 객체들이 있을 경우, 완전한 독립성을 유지하기 위해 깊은 복사를 사용할 수 있습니다.

그리고 그렇게 하면 됩니다! 여러분은 이제 프로의 능력으로 목록을 복사할 수 있습니다. 다음 번에 여러분의 쇼핑 목록을 공유할 때, 예상치 못한 추가가 없이 완벽한 복사를 만들 수 있을 것입니다. 코딩을 즐겁게, 여러분의 목록이 항상 완벽하게 복사되길 바랍니다!

Credits: Image by storyset