파이썬으로 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)]
를 추천한다고 한다.
Ghost