최근 파이썬을 통해 백준 알고리즘 문제를 풀이하던 중, 리스트로 2차원, 3차원 형태를 만들어야 하는 부분이 있었다.
재귀 함수를 통해 원소 하나하나씩 값을 구하고, 해당 리스트에 저장해야 했다.
나는 아래와 같은 방식으로 리스트를 생성하고, 값을 저장했다.
val = [[[0] * 2] * 2] * 2
val[0][0][1] = 7
이를 프롬프트로 진행했을 때, 위와 같은 결과가 되었다. 슬라이싱을 한 적도, 값을 여러 개 지정하려던 의도도 없었는데, 마치 슬라이싱으로 값을 수정한 것처럼 각 리스트의 1번째 원소가 모조리 저장되었다.
솔직히 이전에도 종종 이런 경우가 있었고, 그때마다 결국 그냥 리스트 인덱싱이 아닌, append 함수나 딕셔너리 타입 등을 이용해서 문제를 해결했다.
그러던 중 우연히 다른 분이 풀이한 코드에서 아래와 같이 for문의 리스트 내포 통해 3차원 리스트를 생성하고, 인덱싱을 이용해서 원소 하나하나에 값을 저장하는 것을 보았다. 나는 나랑 같은 오류가 나지 않을까 하고 궁금해서 한 번 실행해봤다.
val = [[[0] * 2 for _ in range(2)] for _ in range(2)]
val[0][0][1] = 7
?????
그런데 이 방식은 내가 원하는 기능이 가능했다. 원소 하나만 골라서 값을 저장할 수 있었다.
일단 내가 생각한 기능이 가능하다는 것이 기뻤지만, 이해하기는 힘들었다. 위에서 생성한 방식과 이 방식 둘 다 결국 리스트를 반복해서 생성한 것이고, 겉으로 봤을 때도 같은 모습이다. 내가 모르는 타입이 있는 건가 해서 type을 보니 둘 다 평범한 list였다.
파이썬에서 얕은 복사, 깊은 복사처럼 내가 모르는 얕은 인덱싱, 깊은 인덱싱 같은 어떤 것이 존재하는 것인지 궁금했는데, 검색해봐도 찾기가 힘들었다.
어쨌든 일단 for문 내포를 통해 생성한 리스트는 이런 것이 가능하다는 것을 알았고, 다음부터는 요긴하게 사용할 수 있는 부분인 것 같아서 블로그에 메모해뒀다.
혹시나 이런 누추한 블로그에 방문한 귀한 분 중에서 이것에 대한 이유, 원리 등을 알고 계신 분은 댓글로 남겨주시면 감사하겠습니다ㅠㅠ
'지극히 개인적인 공부 노트 > 파이썬(Python)' 카테고리의 다른 글
[Python] 함수와 메서드의 차이 (0) | 2021.08.04 |
---|---|
[Python] 변수 이름 짓는 방법 (0) | 2021.08.04 |
[Python] 매우 기초적인 Python 크롤링하는 법(feat. 간단한 DB 설명) (0) | 2021.06.25 |
[Python] 정규표현식 (0) | 2021.05.31 |
[Python] 맷플롯립(matplotlib)의 유용한 기능 정리 (0) | 2021.05.11 |