파이썬에서 *연산자와 얕은 복사(Shallow Copy)

개발공부를해보자·2025년 1월 18일

공부 정리

목록 보기
13/32
  • 파이썬에서 가변 객체에 *연산은 객체가 아닌 참조를 복사한다.
  • 엑셀로 따지면 값 붙여넣기가 아니라 그냥 붙여넣기다.
  • A1, A2, A3, A4 셀에 B1셀을 복사 붙여넣기 하여 =B1이 입력된다면, B1셀을 바꾸면 A1, A2, A3, A4가 모두 바뀐다.
  • 같은 일이 [[]]*3으로 만든 리스트에도 일어난다.

아래는 GPT의 도움을 받아 정리한 내용이다.

# 얕은 복사에 대한 정리와 예제

# 얕은 복사(shallow copy)의 동작 원리
# - Python에서 `*` 연산자는 객체를 복제하지 않고, **참조를 복사**합니다.
# - 이로 인해 리스트의 각 요소가 동일한 객체를 참조하게 됩니다.

# 1. 얕은 복사의 예제
x = [[]] * 3  # 동일한 빈 리스트 객체를 3번 참조
x[0].append(1)  # 첫 번째 요소에 값을 추가
print(x)  # 출력: [[1], [1], [1]] -> 모든 요소가 영향을 받음

# 2. 또 다른 예제: [[1]] * 3
y = [[1]] * 3  # 동일한 [1] 객체를 3번 참조
y[0].append(2)  # 첫 번째 리스트에 값을 추가
print(y)  # 출력: [[1, 2], [1, 2], [1, 2]] -> 모든 요소가 동일한 객체를 참조

# 얕은 복사를 방지하는 방법
# 1. 리스트 컴프리헨션을 사용해 독립적인 객체를 생성
z = [[1] for _ in range(3)]
z[0].append(2)
print(z)  # 출력: [[1, 2], [1], [1]] -> 독립적인 리스트로 동작

# 2. copy.deepcopy()를 사용해 깊은 복사 수행
import copy
w = [[1]] * 3
w = copy.deepcopy(w)  # 깊은 복사 수행
w[0].append(2)
print(w)  # 출력: [[1, 2], [1], [1]] -> 독립적인 리스트로 동작

# 요약
# - `*` 연산자로 생성된 리스트는 얕은 복사로, 동일한 객체를 여러 번 참조합니다.
# - 한 요소를 수정하면 모든 요소가 영향을 받습니다.
# - 독립적인 객체를 생성하려면 리스트 컴프리헨션이나 copy.deepcopy()를 사용하세요.
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글