본문 바로가기

프로그래밍/Python

[Python] 2차원 배열 선언하기

2021년 12월 19일에 작성된 글입니다.

Python에서의 1차원 배열 선언

Python에서 1차원 배열을 선언할 때는 다음과 같이 * 연산자를 이용해 간단하게 선언할 수 있다.

rows = 10
arr = [0] * rows

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

같은 방식으로 2차원 배열 선언

하지만, 2차원 배열을 같은 방식으로 선언하면 문제가 생긴다.

rows = 10
cols = 5
arr = [[0] * cols] * rows

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

일단은 문제 없이 잘 생성된 것 같이 보인다.

그런데 문제가 있다! 😨

방금 생성한 배열 arr의 요소를 하나 골라 변경해보자.

arr[0][0] = 1

[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]

?!?!?!?!?!?! 😱

분명히 arr의 0행 0열에 대해서만 변경을 시도했는데, arr의 모든 행의 0열의 값이 변경되었다!

왜 그럴까? 🤔

Python에서는 * 연산자를 이용해 배열을 선언하게 되면, 얕은 복사(shallow copy)가 진행된다.
즉, 배열 내의 요소들이 같은 객체를 가리키게 되는 것이다.
따라서, 이 방식으로 2차원 배열을 선언하고 요소를 변경하게 되면 다른 요소들의 값도 같이 바뀌는 것이다.

2차원 배열 제대로 선언하기

rows = 10
cols = 5
arr = [[0 for j in range(cols)] for i in range(rows)]

이런 식으로 for 문을 이용하여 선언하면 된다.

문제가 없는지 확인해보자! 🔍

이번에도 arr의 요소 하나를 골라 변경해보자.

arr[0][0] = 1

[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

이번에는 문제 없이 잘 변경되었다!

'프로그래밍 > Python' 카테고리의 다른 글

[Django] STATIC_URL vs STATIC_ROOT  (0) 2024.09.04