알고리즘을 풀다가 실수를 했다.
arr = [[]] * 3 # 빈 리스트로 1 * 3 인 2차원 배열 만들기 시도.
arr[1].append(1)
print(arr)d # [[1], [1], [1]]
내가 의도했던 건 빈 리스트로 2차원 배열을 만들어두고, index가 1인 배열에만 원소를 푸시하고 싶었는데, 결과를 찍어보니 전체 리스트에 1이 푸시된 것을 볼 수 있었다.
아, 리스트는 뮤터블이고 값이 복사되는 게 아니라 주소가 복사되지…🙈
[0] * n
이런 식으로 배열 안에 있는 값이 number처럼 값이 복사되는 타입이면 괜찮은데, 뮤터블 타입이면 저런 참사가 생겨나므로 2차원 배열을 만들고 싶으면 list comprehension
을 사용해야 한다.
# 안에 0을 넣어서 w * h 2차원 배열 만들기
arr = [[0 for x in range(x)] for y in range(h)]
# 0 넣지 않고 빈 리스트로 2차원 배열 만들기
arr = [[] for x in range(h)]