파이썬은 다른 언어들과는 달리 다른 자료형을 담을 수 있는 리스트를 갖고 있다.
하지만 이러한 능력때문에 한가지 주의할 점이 있다.
# Python
a1 = [[0] * 5] * 3
a1[1][1] = 99 # [1][1] 외에 다른 곳의 값도 99로 출력됨
print(a1)
a2 = [[0] * 5 for i in range(3)]
a2[1][1] = 99
print(a2) # 의도대로 작동 됨
a1을 실행하면 한군대만 99로 변환되는게 아니라 총 3군데가 99로 변환된다.
반면, 리스트 컴프리헨션을 사용한 a2는 의도한 대로 작동한다. 다차원 배열을 만들 때는 반드시 a2와 같은 방식으로 만들어야 하는데, 그 이유는 위에서 소개한 리스트 구조와 관련이 있다. a1과 같이 만들면 메모리 주소값들이 복사되어 동일한 데이터에 접근하게 되기 때문이다. 따라서 복사가 아니라 새로 생성해서 리스트에 추가해주는 a2와 같은 방식으로 해야 이런 문제를 방지할 수 있다.
여기서 리스트 컴프리헨션이란 아래와 같다.
a1 = [3] * 8 # 리스트 컴프리헨션이 아님
a2 = [3 for i in range(8)] # 리스트 컴프리 헨션
b1 = [*range(8)] # 리스트 컴프리헨션이 아님
b2 = [i for i in range(8)] # 리스트 컴프리헨션
c = [i ** 2 for i in range(8)] # 리스트 컴프리헨션
# 1, 2, 4, 9, 16, 25, ... 출력됨
e1 = [[1] * 4] * 3 # 이와 같이 다차원 리스트를 만들면 위에 같은 문제가 발생한다.
e2 = [[1] * 4 for i in range(3)]
e3 = [[1 for i in range(4)] for i in range(3)
# 다차원 리스트를 만들때는 e2 또는 e3 같이 리스트를 생성할 것.