파이썬 딕셔너리 합치기: update의 None과 |의 차이

이 카테고리 글 목록

전체글 보기

원본을 유지하면서 두 딕셔너리를 합치려면 merged = base | extra를 쓰세요. base.update(extra)는 기존 base를 바꾸고 None을 반환합니다. 합친 사전을 반환하는 호출이 아니므로 merged = base.update(extra)라고 쓰면 merged에는 None이 들어갑니다.

아래는 일반 dict 두 개로 만든 가상 설정입니다. |와 |=는 Python 3.9 이상에서 사용할 수 있습니다.

base = {"색상": "파랑", "수량": 2}
extra = {"수량": 5, "배송": "당일"}
merged = base | extra

print("새 사전", merged)
print("원본", base)
print("순서를 바꾸면", extra | base)
새 사전 {'색상': '파랑', '수량': 5, '배송': '당일'}
원본 {'색상': '파랑', '수량': 2}
순서를 바꾸면 {'수량': 2, '배송': '당일', '색상': '파랑'}

양쪽에 같은 "수량" 키가 있으면 오른쪽 값이 우선합니다. 첫 결과의 수량은 extra의 5입니다. 순서를 바꾼 마지막 결과에서는 오른쪽인 base의 2가 남습니다. 수량을 더해 7로 만드는 연산은 아닙니다.

같은 입력을 update에 주면 무엇이 바뀔까

이번에는 처음과 같은 두 사전을 새로 만들고 update()를 호출합니다. 같은 키를 덮어쓰는 규칙은 같지만, 결과를 받을 위치와 원본 변경 여부가 다릅니다.

base = {"색상": "파랑", "수량": 2}
extra = {"수량": 5, "배송": "당일"}
result = base.update(extra)

print("반환값", result)
print("수정 뒤 원본", base)
반환값 None
수정 뒤 원본 {'색상': '파랑', '수량': 5, '배송': '당일'}

None이 나왔다고 병합에 실패한 것은 아닙니다. 값은 base 안에 반영됐습니다. 기존 사전을 바꾸려는 목적이면 base.update(extra)를 단독으로 호출하고, 원본을 남기려는 목적이면 첫 예제의 |를 선택하면 됩니다. base |= extra도 일반 dict에서는 기존 사전의 내용을 갱신합니다.

update()는 다른 매핑이나 키·값 쌍을 내놓는 반복 가능한 입력도 받습니다. 반면 이 글의 | 예제는 양쪽이 일반 딕셔너리라는 전제입니다. 사용자 정의 매핑의 동작까지 같은 규칙이라고 가정하지 마세요.

새 사전이라고 안쪽까지 합치거나 복사하지는 않습니다

같은 키의 값이 또 다른 딕셔너리여도, |는 그 안의 키를 재귀적으로 합치지 않습니다. 오른쪽의 값 하나가 왼쪽 값을 통째로 대체합니다.

base = {"화면": {"너비": 640, "높이": 480}}
extra = {"화면": {"너비": 800}}
merged = base | extra

print("합친 값", merged)
print("안쪽 값 공유", merged["화면"] is extra["화면"])
합친 값 {'화면': {'너비': 800}}
안쪽 값 공유 True

"높이"가 자동으로 남지 않은 이유는 "화면"의 값 전체가 바뀌었기 때문입니다. 또한 새로 만든 것은 바깥 사전입니다. 여기서 안쪽 값은 extra의 사전과 같은 객체이므로, 나중에 그 안의 값을 수정하면 extra에서도 보입니다. 중첩 객체의 공유 자체는 딕셔너리 값들이 같은 리스트를 공유하는 사례와 함께 살펴볼 수 있습니다.

예제는 가상 입력이며 Windows 11의 Python 3.14.3에서 각 코드 블록을 독립 실행했습니다. 반환값과 입력 조건은 dict.update 문서, 합치기 연산의 도입 버전과 규칙은 PEP 584의 명세에서 확인할 수 있습니다.

이 카테고리의 다른 글

전체글 보기

댓글 남기기