파이썬 List 곱 (List Multiply) vs List Comprehension

아래와 같은 방식으로 이차원 list를 생성해보자 !

l = [[0] * 3] * 5

길이가 3이며, 모든 요소가 0으로 이루어진 list로 이루어진 이차원 list를 생성하는 코드이다.

list의 곱을 활용하는 방법인데, 이러한 방식으로 이차원 list를 생성 하여 사용한다면, 예기치 않은 결과값이 나올 수도 있다.

같은 list를 여러번 곱한다는 것은, 같은 객체의 참조 값을 재사용 한다는 의미다.
같은 참조 값을 여러번 복사한다는 부분에서 문제가 생길 수 있다.

예시를 보자면,

l = [[0] * 3] * 5 # 이차원 list 생성
l[0][0] = 1 # l[0]에 0번째 요소를 1로 변경

이렇게 0번째 요소만 값을 변경하였는데, 의도와는 다르게 모든 요소의 값이 변경 된 것을 볼 수 있다.




이런 예기치 않은 결과값이 나오는 것을 방지 하기 위해서 list comprehension을 사용해 볼 수 있겠다.

l = [[0 for _ in range(3)] for _ in range(5)]

위의 곱을 사용한 결과와는 다르게, 의도한대로 0번째 요소의 값만 변경 된 것을 볼 수 있다.

list comprehension 을 사용하면, 각각의 list 객체가 모두 고유한 참조 값을 갖고있음을 보장 받을 수 있다.


이차원 list에서 list 곱을 꼭 활용하여야 겠다면,

이런식으로 활용이 가능하다.




참조

좋은 웹페이지 즐겨찾기