파이썬에서 2차원 배열이 필요할 때가 있습니다. 그런데 2차원 배열은 리스트 컴프리헨션등으로 쉽게 만들어 낼 수가 있습니다. 다만, 여기서 하나 주의할 점이 있어서 그 부분만 집고 넘어가려고 합니다.
먼저, 2차원 배열은 화면에 그냥 뿌리면 보기 불편하니, 아래와 같이 2차원 배열을 뿌리는 함수를 먼저 만듭니다.
def print_2d(a):
for row in a:
for c in row:
print (c,end= ' ')
print ('')
2중 for문으로 2중 리스트 선언
ROW, COL = 4, 5
arr = [[0 for c in range(COL)] for row in range(ROW)]
# 5x4 리스트를 생성합니다. = (4열 5행)
arr[2][3] = 9 # (3, 2)에 값을 변경합니다.
print_2d(arr)
'''
0 0 0 0 0
0 0 0 0 0
0 0 0 9 0
0 0 0 0 0
'''
2차원 배열 access
# arr[row][col]
arr[2][3] = 9
위와 같이 row가 앞쪽에 위치합니다. 이 부분도 은근히 헷갈릴 수 있으니 주의합시다.
*연산자와 for문으로 리스트 선언
arr = [[0]*5 for i in range(4)]
arr[2][3] = 9
print_2d(arr)
'''
0 0 0 0 0
0 0 0 0 0
0 0 0 9 0
0 0 0 0 0
'''
연산자 *로 2중 리스트 선언
arr = [[0]*5 ]*4
arr[2][3] = 9
print_2d(arr)
'''
0 0 0 9 0
0 0 0 9 0
0 0 0 9 0
0 0 0 9 0
'''
이 방법은 주의해야합니다. 위의 두 방법 말고 이 방법으로 배열을 선언하게 되면, row를 새로 생성하는것이 아니라. 단순히 요소를 복사하게 되는 얕은복사 (shallow copy)가 발생합니다. 즉, row의 첫번째 값의 링크로 만들어진 것이라 저런식으로 만들게 되면 어떤 값이든 바꿀때 마다 값이 같이 변경됩니다. 위 예제에서도 (3,2)를 변경했는데 모든 row가 같이 바뀐것을 확인할 수 가 있습니다.
이러한 방식으로 선언 뒤에, 값을 변경하게되면 다른 원소들도 값이 변경되는 현상이 발생하게 되므로 이를 인지하고, 후에 대입연산자를 통해 값을 변경하지 않는 경우에만 사용하는것이 유리합니다. 그런데 위 방법은 그냥 쓰지 않는것을 추천합니다
a = [0]*10
a[3] = 8
print(a)
# [0, 0, 0, 8, 0, 0, 0, 0, 0, 0]
물론 1차원 배열을 생성할 때는 이런 shallow copy문제는 없습니다.
댓글 없음:
댓글 쓰기