본문 바로가기
관리자

Programming-[Backend]/Python

[TIL] Deepcopy, dict 순서 유지

728x90
반응형

 

1. Deepcopy: dict

 

어떤 원본 값을 변형하지 않고 다음 로직에서 사용하기 위해서는 deepcopy를 사용하여 참조되는 값의 변경이 일어나지 않도록 해줘야한다.

 

some_value = _get_some_value( ... )
# some_value = {"a": 1, "b": 2}

another_result = _get_another_result(some_value=some_value)

def _get_another_result(some_value):
  result = some_value
  result["a"] = 3
  return result

 

위 코드처럼 간단한 경우에는 한눈에 _get_another_result를 실행하면서 some_value 값도 변경된다는 것을 인지할 수 있으나 코드가 복잡해지면 이렇게 참조에 의해 원본값이 변경될 수 있다는 것을 놓칠 수도 있다.

 

dict depth

위 코드에서 result=deepcopy(some_value)가 아니라 result=dict(some_value)로 새로운 dictionary를 만들어낼 수도 있다. 그러나 dict의 경우 depth가 2단 이상으로 깊어지기 시작하면 중첩된 여러 depth 값은 참조값을 그대로 들고 올 수도 있으므로 deepcopy를 사용하여 완전히 깊은 복사를 실행해주는 것이 좋다.

 

 

2. dict 순서 유지: OrderedDict, python 3.7

dictionary를 사용할 때 순서가 입력된대로 유지될 것이라 맹신하면 안된다. 파이썬 3.7부터는 딕셔너리가 내부적으로 인덱스를 사용하면서 입력 순서에 따라 dict의 순서가 유지된다. 

 

하지만 파이썬 3.6이하에서는 입력 순서를 유지하는 객체로 OrderedDict를 사용했으며, 3.6 이하의 파이썬 인터프리터를 사용하는 환경이나 라이브러리 등에서는 입력 순서가 유지될 것이라 기대하면 안된다.

728x90
반응형