ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 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]]

     

    저는 배열을 생성할 때 거의 리스트 컴프리헨션만 사용합니다. 

    1. 곱하기를 이용할 일(레퍼런스 복사)이 거의 없기도 하거니와,
    2. 곱하기 문이 잘 안 읽힙니다. 의미가 좀 모호합니다. 
      '[0] * n' 괄호까지 곱한다는 의미로 읽혀지는데,
      실제로는 괄호 안에 있는 것('0')을 반복합니다.
    3. 이런 디테일을 모르는 분이 코드를 볼 때 불필요한 오해를 할 수 있습니다. 
    반응형
Designed by Tistory.