💻 프로그래밍 언어/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차원-배열-선언하기

 

반응형