반응형
다차원 배열의 얕은 복사
>>> 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]]
반응형
'Python > 알고리즘팁' 카테고리의 다른 글
파이썬의 iterator 사용법 (0) | 2023.01.06 |
---|---|
파이썬 얕은복사 깊은복사의 이해 (0) | 2022.12.21 |
파이썬 약수 구하기 (0) | 2022.12.13 |
파이썬 Queue vs Deque 어느것을 사용할 까? (0) | 2022.12.09 |
[파이썬] global과 nonlocal 이해하기 (0) | 2022.01.21 |
댓글