💻 프로그래밍 언어/Python
[Python] 2차원 배열 선언하기
케로⸝⸝◜࿀◝ ⸝⸝
2024. 6. 9. 22:56
📓 Python에서의 1차원 배열 선언
Python에서 1차원 배열을 선언할 때는 다음과 같이 * 연산자를 이용해 간단하게 선언할 수 있다.
rows = 10
arr = [0] * rows
print(arr)
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
그렇다면, 같은 방식으로 2차원 배열도 선언할 수 있지 않을까?
rows = 10
cols = 5
arr = [[0] * cols] * rows
for i in range(rows):
print(arr[i])
'''
[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의 요소를 하나 골라 변경해보자.
rows = 10
cols = 5
arr = [[0] * cols] * rows
arr[0][0] = 1
for i in range(rows):
print(arr[i])
'''
[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열 값이 1로 변경되었다!
🤔 왜 그럴까...
Python에서는 * 연산자를 이용해 배열을 선언하게 되면, 얕은 복사(shallow copy)가 진행된다.
즉, 배열 내의 요소들이 같은 객체를 가리키게 되는 것이다!
따라서, * 연산자를 사용한 방식으로 2차원 배열을 선언하고 요소를 변경하게 되면,
다른 요소들의 값도 같이 바뀌는 것이다.
✍️ 2차원 배열 제대로 선언하기
rows = 10
arr = [[] for _ in range(rows)]
print(arr)
# [[], [], [], [], [], [], [], [], [], []]
rows = 10
cols = 5
arr = [[0 for _ in range(cols)] for _ in range(rows)]
for i in range(rows):
print(arr[i])
'''
[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]
'''
위와 같이 리스트 내포(List Comprehension)를 활용한 for문을 이용하여 선언하면 된다.
리스트명 = [표현식 for 변수 in 반복 가능한 대상]
💡 다시 확인해보자!
그럼, 다시 한번 arr의 요소를 하나 골라 변경해보고 정말 문제가 없는지 확인해보자!
rows = 10
cols = 5
arr = [[0 for _ in range(cols)] for _ in range(rows)]
arr[0][0] = 111
for i in range(rows):
print(arr[i])
'''
[111, 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행 0열의 요소만 변경된 것을 확인할 수 있다!
✔️ 참고 블로그
https://devpouch.tistory.com/76
https://velog.io/@sjy5386/Python-2차원-배열-선언하기
반응형