[Python] 2차원 배열을 바르게 선언하는 방법

Yongjun Park·2022년 3월 9일
0

Source 1

Source 2

7 * 2 2차원 배열을 선언한다고 하자.

arr = [[0] * 2]] * 7 # 1번
arr = [[0] * 2 for _ in range(7)] # 2번
arr = [[0 for _ in range(2)] for _ in range(7)] # 3번

파이썬이 가독성이 아무리 좋다지만, 1번처럼 짜면 망한다.

2번이나 3번 방식을 택하도록 하자.


1번 방식으로 짰을 때, [0] * 2는 제대로 작동하는 반면,
거기에 다시 * 7을 하면 [0, 0]이라는 객체의 주소로 배열이 만들어진다.

[0, 0]의 주소가 0x1234라면, [0x1234, 0x1234, 0x1234, 0x1234, 0x1234, 0x1234, 0x1234]가 생성되는 것이다.

즉, 이것은 deep copy가 아니라 shallow copy다!


arr = [[0] * 2]] * 7]
arr[0][0] = 1

이때, arr의 값은 다음과 같다.
[[1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0]]

shallow copy가 빚어낸 참사다.

profile
추상화되었던 기술을 밑단까지 이해했을 때의 쾌감을 잊지 못합니다

0개의 댓글