파이썬으로 1차원 이상의 리스트를 만들다가 신기한 문제점에 봉착한 적이 있다.

필자는 그냥 생각 없이 이런 코드를 이용하여 5 X 2짜리 리스트를 만들려 했다.

>>> Lists = [[0] * 2] * 5
>>> Lists

출력은 본인 생각대로 [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] 이 나왔다.

그 후 for문을 이용해서 값을 채워주었다. 숫자를 채워 넣은 후 출력해보니 신기한 현상이 발생했다.

모든 리스트에 마지막으로 넣었던 값이 나오는 것이다. 못믿겠으면 이 코드를 한번 실행시켜보자.

Lists = [[0] * 2] * 5

for i in range (5):
    for j in range(2):
        Lists[i][j] = i * j

print(Lists)

결과를 보면 [[0, 4], [0, 4], [0, 4], [0, 4], [0, 4]] 가 나오는 걸 볼 수 있다. 그래서 본인은 파이썬 레퍼런스를 보았다.

레퍼런스에서는 이렇게 설명했다. Lists = [[0] * 2] * 5 에서 * 는 객체의 복사를 실행하지 않고 객체의 레퍼런스를 복사하여 같은 하나의[0, 0] 리스트를 참조한다고 한다.

따라서 복하를 원하면 위의 방법보다 Lists = [[0] * 2 for i in range(2)] 를 추천한다고 한다.