-
2차원 리스트 초기화 시 주의할 점Python 2020. 10. 12. 17:06반응형
n x n 2차원 리스트를 0으로 초기화 시켜보고자 합니다.
파이썬의 리스트 관련 문법을 살펴보다 보면 아래와 같이 초기화 할 수 있을 것으로 생각합니다.
n = 4 two_dimensional_list = [[0] * n] * n for e in two_dimensional_list: print(e)
위의 코드를 실행해보면 다음 그림과 같이 정상적으로 초기화 된 것으로 보입니다.
하지만 리스트 요소 값 중 하나를 다른 값으로 업데이트 해보도록 하겠습니다.
n = 4 two_dimensional_list = [[0] * n] * n for e in two_dimensional_list: print(e) print("=============") two_dimensional_list[0][0] = 1 for e in two_dimensional_list: print(e)
다음과 같이 의도한 바와 다르게 모든 two_dimensioanl_list[n][1]의 요소가 1로 바뀌게 되는 것을 확인할 수 있습니다.
위와 같은 문제가 발생하는 이유는 다음과 같습니다.
- list 타입 변수(이하 A)에 * 연산을 하는 경우 list의 모든 원소들에 대해 복사를 진행하게 됩니다.
- A에 원소 중에 list 타입의 원소(이하 B)가 있다고 할 때, A * n 하면
- 메모리 상에 B가 여러개 생성되는 것이 아니라 B는 그대로 하나만 있고 그것을 가르키는 포인터만 증가하게 됩니다.
따라서 2차원 리스트 초기화를 위해서는 다음과 같은 구문을 사용하도록 합니다.
n = 4 two_dimensional_list = [[0] * n for _ in range(n)] for e in two_dimensional_list: print(e) print("=============") two_dimensional_list[0][0] = 1 for e in two_dimensional_list: print(e)
실행 결과 2차원 리스트의 초기화가 적절히 진행된 것을 확인해볼 수 있습니다.
'Python' 카테고리의 다른 글
유용한 표준 라이브러리 (0) 2020.12.24 Python 기본 정렬과 커스텀 정렬 (0) 2020.12.24 문자열 뒤집기 (0) 2020.12.21 console 입출력과 형변환 (0) 2020.10.08 class 사용하기 (0) 2020.09.28