7 * 2
2차원 배열을 선언한다고 하자.
arr = [[0] * 2]] * 7 # 1번
arr = [[0] * 2 for _ in range(7)] # 2번
arr = [[0 for _ in range(2)] for _ in range(7)] # 3번
파이썬이 가독성이 아무리 좋다지만, 1번처럼 짜면 망한다.
2번이나 3번 방식을 택하도록 하자.
1번 방식으로 짰을 때, [0] * 2
는 제대로 작동하는 반면,
거기에 다시 * 7
을 하면 [0, 0]
이라는 객체의 주소로 배열이 만들어진다.
[0, 0]
의 주소가 0x1234
라면, [0x1234, 0x1234, 0x1234, 0x1234, 0x1234, 0x1234, 0x1234]
가 생성되는 것이다.
즉, 이것은 deep copy가 아니라 shallow copy다!
arr = [[0] * 2]] * 7]
arr[0][0] = 1
이때, arr
의 값은 다음과 같다.
[[1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0]]
shallow copy가 빚어낸 참사다.