-
[파이썬] 2차원 리스트, 곱하기 VS 리스트 컴프리헨션Python/이것저것 파이썬 2021. 12. 22. 22:21반응형
모 코딩 커뮤니티에 올라온 질문에 달았던 답변을 정리했습니다.
n = 2 g1 = [[0] * (n + 1)] * (n + 1) g1[1][2] = 1 print(g1) # [[0, 0, 1], [0, 0, 1], [0, 0, 1]]
곱하기로 2차원 리스트를 만들면,
리스트는 참조(reference)로 복사된 것을 볼 수 있습니다.
실제론 같은 객체란 이야기죠.하나에 1을 넣었는데 3개에 1이....
n = 2 g2 = [[0 for _ in range(n + 1)] for _ in range(n + 1)] g2[1][2] = 1 print(g2) # [[0, 0, 0], [0, 0, 1], [0, 0, 0]]
리스트 컴프리헨션(list comprehension)을 사용해서 2차원 리스트를 만들면,
리스트를 새로 생성하기 때문에 생각하던 데로(?) 작동됩니다.다음 코드가 어떻게 작동할지 예상이 되시죠?
n = 2 g3 = [[0] * (n + 1) for _ in range(n + 1)] g3[1][2] = 1 # [[0, 0, 0], [0, 0, 1], [0, 0, 0]]
n = 2 g = [[0 for _ in range(n + 1)]] * (n + 1) g[1][2] = 1 print(g) # [[0, 0, 1], [0, 0, 1], [0, 0, 1]]
저는 배열을 생성할 때 거의 리스트 컴프리헨션만 사용합니다.
- 곱하기를 이용할 일(레퍼런스 복사)이 거의 없기도 하거니와,
- 곱하기 문이 잘 안 읽힙니다. 의미가 좀 모호합니다.
'[0] * n' 괄호까지 곱한다는 의미로 읽혀지는데,
실제로는 괄호 안에 있는 것('0')을 반복합니다. - 이런 디테일을 모르는 분이 코드를 볼 때 불필요한 오해를 할 수 있습니다.
반응형