본문 바로가기
Python/알고리즘팁

파이썬 다차원 배열 복사 시 주의사항

by 붕어사랑 티스토리 2022. 12. 15.
반응형

다차원 배열의 얕은 복사

>>> a = [[1,2],[3,4]]
>>> b = a[:]
>>> a
[[1, 2], [3, 4]]
>>> b
[[1, 2], [3, 4]]



>>> a[1][1] = 9
>>> a
[[1, 2], [3, 9]]
>>> b
[[1, 2], [3, 9]]

위 케이스처럼 배열을 복사하면 얕은 복사가 일어난다.

문제는 리스트안에 mutable한 변수(List와 Dict같은)이 있으면 주소값이 복사되어버린다!

그래서 코드 후반부 처럼 값을 변경하면 다른값도 전부 변경되어 버린다.

 

 

a = b[:]

a = b.copy()

 

전부 얕은복사이다.

 

Mutable 데이터 타입

  • 사용자 정의 객체
  • list
  • dictionary
  • set 

Immutable 데이터 타입

  • int
  • float
  • decimal
  • bool
  • string
  • tuple
  • range

 

 

깊은 복사를 통한 문제 해결

>>> import copy
>>> a = [[1,2],[3,4]]
>>> b= copy.deepcopy(a)
>>> a
[[1, 2], [3, 4]]
>>> b
[[1, 2], [3, 4]]



>>> a[1][1] = 9
>>> a
[[1, 2], [3, 9]]
>>> b
[[1, 2], [3, 4]]

copy모듈의 deepcopy를 이용하면 위 문제를 해결 할 수 있다.

 

 

 

 

다차원 배열 생성시 주의사항

아래의 코드는 흔히 배열을 선언할 때 사용하는 코드이다

>>> a = [0] * 3
>>> a
[0, 0, 0]

>>> a[0] = 9
>>> a
[9, 0, 0]

 

 

위 방법을 통해 이차원 배열을 사용하면?

>>> a = [[0] * 3] * 3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0] = 9
>>> a
[[9, 0, 0], [9, 0, 0], [9, 0, 0]]

위에서 보았던 얕은 복사의 케이스 문제가 생겨버린다.

이를 해결하면 배열을 생성할 때 * 연산을 쓰지 말고 for _ in range() 를 사용하자

 

 

 

>>> a = [[ 0 for _ in range(3)] for _ in range(3)]
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0] = 9
>>> a
[[9, 0, 0], [0, 0, 0], [0, 0, 0]]
반응형

댓글