프로그래밍/파이썬(Python)

얕은 복사와 깊은 복사가 이루어지는 경우 비교

정정훈훈 2024. 10. 21. 13:06
반응형

그러면 얕은 복사랑 깊은 복사가 일어나는 경우를 비교해서 설명해줘. 깊은 복사는 .copy() 쓰지 않는 경우에 한해서

 

ChatGPT의 말:

ChatGPT

얕은 복사와 깊은 복사가 각각 발생하는 경우를 비교하여 설명하겠습니다. 특히 깊은 복사는 .copy()를 사용하지 않는 경우에 한해서 설명하겠습니다.

1. 얕은 복사가 발생하는 경우

a. 슬라이싱 (Slicing)

  • 슬라이싱을 통해 배열의 일부를 참조할 때 얕은 복사가 발생합니다. 슬라이싱한 배열은 원본 배열의 메모리 주소를 공유하므로, 슬라이싱된 배열에서 값이 변경되면 원본 배열에도 영향을 미칩니다.
python
코드 복사
import numpy as np a = np.array([1, 2, 3, 4, 5]) b = a[1:4] # 슬라이싱 (얕은 복사) b[0] = 10 print(a) # [1 10 3 4 5] -> 원본 배열이 변경됨

b. view() 메서드

  • view() 메서드는 배열의 얕은 복사를 수행합니다. 이 역시 원본 배열과 메모리 공간을 공유하므로, 새 배열에서 값을 변경하면 원본 배열에도 영향을 미칩니다.
python
코드 복사
a = np.array([1, 2, 3]) b = a.view() # 얕은 복사 b[0] = 10 print(a) # [10 2 3] -> 원본 배열이 변경됨

c. 할당(Assignment)

  • 배열을 단순히 다른 변수에 할당할 경우도 얕은 복사가 발생합니다. 이 경우 두 배열은 같은 메모리 공간을 참조하며, 하나를 수정하면 다른 배열에도 영향을 미칩니다.
python
코드 복사
a = np.array([1, 2, 3]) b = a # 얕은 복사 (주소값만 복사됨) b[0] = 10 print(a) # [10 2 3] -> 원본 배열이 변경됨

2. 깊은 복사가 발생하는 경우 (.copy() 사용하지 않는 경우)

a. 배열 연산 (Arithmetic Operations)

  • 배열 간의 산술 연산은 새로운 배열을 반환하며, 이 배열은 원본 배열과 독립적인 메모리 공간에 저장됩니다. 따라서 깊은 복사가 자동으로 발생합니다.
python
코드 복사
a = np.array([1, 2, 3]) b = a + 1 # 산술 연산은 깊은 복사 b[0] = 10 print(a) # [1 2 3] -> 원본 배열이 변경되지 않음

b. 배열 변환 메서드 (Reshape, Transpose 등)

  • reshape(), flatten(), transpose() 등의 메서드는 배열의 구조를 변환하며, 새로운 배열을 반환합니다. 이 배열은 원본과 독립적이므로 깊은 복사가 발생합니다.
python
코드 복사
a = np.array([[1, 2], [3, 4]]) b = a.T # 전치 행렬은 새로운 배열을 반환 (깊은 복사) b[0, 0] = 10 print(a) # [[1 2], [3 4]] -> 원본 배열이 변경되지 않음

c. 데이터 타입 변환 (astype)

  • astype() 메서드는 배열의 데이터 타입을 변환하며, 새로운 배열을 반환하므로 깊은 복사가 이루어집니다.
python
코드 복사
a = np.array([1, 2, 3], dtype=np.int32) b = a.astype(np.float64) # 데이터 타입 변환은 깊은 복사 b[0] = 10.0 print(a) # [1 2 3] -> 원본 배열이 변경되지 않음

d. 배열 연결 및 결합 함수 (concatenate, stack 등)

  • np.concatenate(), np.stack(), np.hstack(), np.vstack() 같은 배열을 연결하거나 합치는 함수들은 새로운 배열을 반환하므로 깊은 복사가 이루어집니다.
python
코드 복사
a = np.array([1, 2]) b = np.array([3, 4]) c = np.concatenate((a, b)) # 배열 결합은 깊은 복사 c[0] = 10 print(a) # [1 2] -> 원본 배열이 변경되지 않음

e. 배열을 반환하는 기타 함수들

  • 정렬 (np.sort()), 고유값 추출 (np.unique()), 조건 필터링 (np.where()) 등 많은 함수들이 원본 배열을 변형하지 않고 새로운 배열을 반환하므로, 깊은 복사가 발생합니다.
python
코드 복사
a = np.array([3, 1, 2]) b = np.sort(a) # 정렬된 배열은 새로운 배열 (깊은 복사) b[0] = 10 print(a) # [3 1 2] -> 원본 배열이 변경되지 않음

얕은 복사 vs. 깊은 복사 비교 요약

복사 방식상황복사 유형원본 배열에 영향
슬라이싱 배열의 일부를 슬라이싱 얕은 복사 원본 배열에 영향 O
view() 배열을 새로운 뷰로 생성 얕은 복사 원본 배열에 영향 O
할당 배열을 다른 변수에 할당 얕은 복사 원본 배열에 영향 O
산술 연산 배열 간 산술 연산 깊은 복사 원본 배열에 영향 X
배열 변환 reshape(), transpose() 등 깊은 복사 원본 배열에 영향 X
데이터 타입 변환 astype() 깊은 복사 원본 배열에 영향 X
배열 결합 concatenate(), stack() 등 깊은 복사 원본 배열에 영향 X
배열 반환 함수 sort(), unique() 등 깊은 복사 원본 배열에 영향 X

이러한 차이를 이해하면, 배열을 다룰 때 불필요한 데이터 변경을 방지하거나, 필요에 따라 원본 배열에 영향을 미치는 복사를 선택할 수 있습니다.

 
4o
반응형