파이썬 곱하기로 객체 생성시

김도현·2023년 1월 1일
0

파이썬에선 [1]*4 와 같은 식으로 곱하기 연산자를 이용해 객체를 복사해 생성할 수 있다

그런데 백준을 풀던중 1로 꽉찬 2차원 배열을 만들어야해서 pop_map = [[1]*14]*14 와 같이 선언했다.

그런데 무슨일인가, 이론상 완벽한데 틀리는 것이 아니겠는가
그래서 저 배열의 변화 과정을 전부 print해서 살펴봤다.
살펴보니 난 분명 배열의 pop_map[0][0]에만 다른 값을 할당했는데 다른 곳의 값도 바뀐다.
알아보니 곱하기 연산자로 객체를 복사해 생성시 shallow copy가 된다고한다. 값이 전부 바뀌진 않고 각 리스트의 0번 인덱스 값만 바뀌는것을 보니 2차원부터 그러는거 같다.

그래서 객체 생성시 * 가아닌 list comprehension을 통해 생성하니 해결 됐다.

shallow copy된 것을 끊어주는 것과 같은 다른 방법들을 찾아봤지만 List comprehension이 제일 빠르다고 한다.

또, 더 알아보니 그냥 안에 요소들이 같으면 주소값이 같다.

아마 파이썬 내부적으로 효율적인 메모리관리를 위해 저런식으로 한거 같다.

profile
예이

0개의 댓글