※ 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 |
---|