파이썬에서 b =[[]] * n
은 문제가 생긴다.
내부의 []
이 같은 인스턴스의 참조이므로 단 한 개의 값만 넣어도 모두 값이 같다.
따라서 b = [[] for _ in range(n)]
형태로 써야 한다.
기본값이 있는 딕셔너리로 쓰고 싶다면,
from collections import defaultdict
w = defaultdict(lambda: [[] for _ in range(n)])
방식을 써야 한다. 파이써닉 하다고 할 수 있다. 과연 읽기 편할까.
읽기 편하다는 관점은 두 가지가 있는데,
첫째, 코드의 흐름을 대략적으로 알고 있거나 주석이 친절하거나 흐름의 의도가 명확할 때이다. 저 한 줄의 코드는 사고 실험으로 돌리지 않아도 어떤 코드라고 1초안에 "대략적"으로 추정이 가능하므로 소설 읽듯이 읽으면 된다. 코드의 상하로 분량이 함축되므로 눈에 잘 들어오고 뇌근육에 압축적으로 들어온다. 효율이 좋다.
둘째, 코드의 개별 구문 자체가 낱낱히 명확할 때이다. 컴퓨터와 언어의 흐름을 정확하게 이해할 수 있다, 단점은 코드가 상하로 길고 한 눈에 들어오지 않으며, 눈과 뇌가 머무는 시간이 길다. 그러다보니 전체 흐름의 의도를 놓치기도 쉽다.
이렇게 보면 전자의 방법이 좋고 파이써닉 하다고 볼 수는 있는데, 문제는 레거시 화석이 오류를 일으켰을 때 발생한다.
하나의 소설을 읽었을 때 대략의 플롯을 알고 있는 것과 상세 에피소드의 인과라든가 장소 이름, 시간대를 정확하게 알고 있는 것은 다르다.
파이브스타스토리 작가의 자손이 속편을 낸다고 가정하자. 원작을 읽을 때 전자의 방법은 매우 효율적이다. 큰 흐름을 머리속에 넣기 좋다. 그러나 후자의 방법으로 연대기 연표를 모두 읽지 않으면 설정 오류가 발생하기 쉽다. 그렇다고 연대기 연표의 상세를 읽으며 시간을 깊이 소모하면 전체 플롯의 흐름을 놓치기 쉽다.
하나의 방법이 무조건 옳다 좋다 나쁘다 그르다고 정해놓고 사는게 이렇게 해롭습니다. 오늘의 뻘소리 끗.