ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리스트 컴프리헨션 사용시 주의점
    Programming/Python 2022. 8. 18. 15:10

    강화학습 코드를 작성하다가 정말 작은 실수 때문에 3시간을 날려서 기록으로 남겨둔다.

    테이블 기반의 강화학습 코드를 작성할 때 주의해야할 것은 리스트의 얕은 복사와 깊은 복사 문제이다. 

     

    # 얕은 복사

    action_value = [0 for _ in range(5)]
    value_table = [action_value for _ in range(5)]
    value_table[0][0] = 1
    print(value_table)

    위와 같이 코드를 작성하면 결과가 아래와 같이 출력된다. 

    [[1, 0, 0, 0, 0],

     [1, 0, 0, 0, 0],

     [1, 0, 0, 0, 0],

     [1, 0, 0, 0, 0],

    [1, 0, 0, 0, 0]]

     

    왜 일까? value_table[0]의 원소들은 모두 action_value를 가리키고 있다. 따라서 하나의 원소를 바꾸면 모두 결과가 바뀌어 버리는 것이다. 이를 방지하려면 아래와 같이 리스트를 깊은 복사를 하도록 코드를 수정하거나 리스트 컴프리헨션을 이중으로 써야한다. 

     

    # 깊은 복사

    action_value = [0 for _ in range(5)]
    value_table = [action_value[:] for _ in range(5)]
    value_table[0][0] = 1
    print(value_table)
    
    value_table = [[0 for _ in range(5)] for _ in range(5)]
    value_table[0][0] = 1
    print(value_table)

    [[1, 0, 0, 0, 0],

    [0, 0, 0, 0, 0],

    [0, 0, 0, 0, 0],

    [0, 0, 0, 0, 0],

    [0, 0, 0, 0, 0]]

    'Programming > Python' 카테고리의 다른 글

    [Python] 파이썬 Closure 및 Decorator 설명  (0) 2022.08.12
    [Python] __all__ 의 역할  (0) 2022.08.09

    댓글

Designed by Tistory.