파이썬 - 배열 복사

안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 오늘은 파이썬에서 배열을 복사하는 흥미로운 세계에 몸을 던지러 가보겠습니다. 여러분의 친절한 이웃 컴퓨터 과학 선생님으로서, 여러분을 이 여정을 안내하는 것을 기대하고 있습니다. 그럼, 좋아하는 음료를 들고 편하게 앉아 이 모험을 함께 시작해보세요!

Python - Copy Arrays

파이썬에서 배열 이해

배열을 복사하기 전에, 파이썬에서 배열에 대한 이해를 빠르게 새로고침해 보겠습니다. 파이썬에서는 일반적으로 배열을 나타내기 위해 리스트를 사용합니다. 리스트는 다양한 종류의 데이터를 포함할 수 있는 다재다능한 자료형입니다.

다음은 파이썬에서의 간단한 리스트 예제입니다:

fruits = ["apple", "banana", "cherry"]
print(fruits)

출력:

['apple', 'banana', 'cherry']

이 예제에서, fruits는 세 가지 문자열 요소를 포함하는 우리의 리스트(또는 배열)입니다.

이제 이 배열을 어떻게 복사할 수 있을지 탐구해보겠습니다!

대입 연산자를 사용하여 배열 복사

배열을 복사하는 가장 간단한 방법은 대입 연산자(=)를 사용하는 것이 아닐까요? 그러나 이 방법은 함정이 따릅니다. 그것을 action에서 확인해보겠습니다:

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

print("Original list:", original_list)
print("Copied list:", copied_list)

# 이제 복사된 리스트를 수정해보겠습니다
copied_list[0] = 100

print("\nAfter modification:")
print("Original list:", original_list)
print("Copied list:", copied_list)

출력:

Original list: [1, 2, 3, 4, 5]
Copied list: [1, 2, 3, 4, 5]

After modification:
Original list: [100, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]

놀라운 일이죠! 우리가 copied_list를 수정했을 때, original_list도 변화했습니다! 이는 대입 연산자가 새로운 리스트를 생성하지 않기 때문입니다. 대신, 두 변수는 동일한 메모리에 있는 리스트를 가리킵니다. 마치 친구에게 집 열쇠를 주는 것과 같아요 - 그들은 새로운 집을 얻지 않고, 단지 여러분의 집에 접근할 수 있을 뿐입니다!

얕은 복사 방법

이 문제를 피하기 위해, 우리는 얕은 복사 방법을 사용할 수 있습니다. 이들은 새로운 리스트를 생성하지만, 요소들은 여전히 동일한 객체를 참조합니다. 몇 가지 얕은 복사를 만드는 방법을 살펴보겠습니다:

  1. copy() 메서드를 사용:
original_list = [1, 2, 3, 4, 5]
copied_list = original_list.copy()

copied_list[0] = 100

print("Original list:", original_list)
print("Copied list:", copied_list)

출력:

Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
  1. list() 생성자를 사용:
original_list = [1, 2, 3, 4, 5]
copied_list = list(original_list)

copied_list[0] = 100

print("Original list:", original_list)
print("Copied list:", copied_list)

출력:

Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
  1. 슬라이싱을 사용:
original_list = [1, 2, 3, 4, 5]
copied_list = original_list[:]

copied_list[0] = 100

print("Original list:", original_list)
print("Copied list:", copied_list)

출력:

Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]

이 방법들은 간단한 리스트에 적합합니다. 하지만 리스트의 리스트가 있을 때 어떻게 해야 할까요? 그럴 때는 더 강력한 도구를 꺼내야 합니다!

깊은 복사를 사용하여 배열 복사

중첩된 리스트나 복잡한 객체를 다룰 때, 깊은 복사를 사용해야 합니다. 이는 원본 리스트의 완전히 독립적인 복사본을 생성하며, 모든 중첩된 객체를 포함합니다. 마치 여러분의 집과 그 안의 모든 것을 클론하는 것과 같습니다!

깊은 복사를 사용하려면, copy 모듈을 임포트해야 합니다:

import copy

original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
deep_copied_list = copy.deepcopy(original_list)

deep_copied_list[0][0] = 100

print("Original list:", original_list)
print("Deep copied list:", deep_copied_list)

출력:

Original list: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Deep copied list: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]

보시다시피, 깊은 복사된 리스트를 수정해도 원본 리스트에는 영향을 주지 않습니다, 중첩된 요소조차도 마찬가지입니다.

언제 깊은 복사를 사용할까요?

깊은 복사는 강력하지만, 성능 비용이 따릅니다. 마치 집을 옮기기 위해 전부 패킹하는 것처럼 - 더 많은 시간과 노력이 필요합니다! 다음과 같은 경우에 깊은 복사를 사용하세요:

  1. 중첩된 리스트나 복잡한 객체가 있을 때
  2. 원본과 복사된 데이터 간의 완전한 독립성을 보장해야 할 때
  3. 리스트 내 mutable 객체를 다룰 때

복사 방법 요약

다음은 우리가 논의한 복사 방법을 요약한 편리한 표입니다:

방법 문법 복사 유형 사용 사례
대입 (=) new_list = old_list 참조 (복사하지 않음) 두 변수가 동일한 리스트를 참조하고 싶을 때
copy() 메서드 new_list = old_list.copy() 얕은 복사 불변 요소가 있는 간단한 리스트
list() 생성자 new_list = list(old_list) 얕은 복사 불변 요소가 있는 간단한 리스트
슬라이싱 new_list = old_list[:] 얕은 복사 불변 요소가 있는 간단한 리스트
copy.deepcopy() new_list = copy.deepcopy(old_list) 깊은 복사 중첩된 리스트나 가변 객체가 있는 리스트

기억하세요, 적절한 복사 방법을 선택하는 것은 직업을 위한 적절한 도구를 선택하는 것과 같습니다. 그들은 그림 프레임을 걸어 두는 데 sledghammer를 사용하지 않을 테니까요? 마찬가지로, 필요에 따라 가장 간단한 복사 방법을 사용하세요.

결론

축하합니다! 여러분은 파이썬 배열 복사에 대해 마스터링하여 파이썬 실력을 한 단계 업습니다. 간단한 대입에서 깊은 복사까지, 여러분은 이제 다양한 시나리오를 처리할 수 있는 도구킷을 갖추었습니다. 기억하세요, 연습이Prefect를 만듭니다. 여러분의 프로젝트에서 이러한 방법을 시도해보세요.

우리의 끝에, 조금의 프로그래머 유머를: 프로그래머가 왜 직업을 그만두었나요? 그는 배열을 못알아들었어요! ? (이해하셨나요? 증가하는 것을 말이에요!)

파이썬을 즐기며 계속 코딩하고, 배우며, 가장 중요한 것은 즐겁게 즐기세요!

Credits: Image by storyset