-
리스트 컴프리헨션 사용시 주의점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