python 25 lines · 6 steps

How a recursive deep merge works in Python

Combine nested dictionaries by recursing into shared keys while copying values so the inputs stay untouched.

Explained by highlit
1from copy import deepcopy
2from typing import Any, Mapping
3 
4 
5def deep_merge(base: Mapping[str, Any], override: Mapping[str, Any]) -> dict:
6 result = deepcopy(dict(base))
7 
8 for key, override_value in override.items():
9 base_value = result.get(key)
10 
11 if isinstance(base_value, Mapping) and isinstance(override_value, Mapping):
12 result[key] = deep_merge(base_value, override_value)
13 elif isinstance(base_value, list) and isinstance(override_value, list):
14 result[key] = base_value + deepcopy(override_value)
15 else:
16 result[key] = deepcopy(override_value)
17 
18 return result
19 
20 
21def merge_configs(*configs: Mapping[str, Any]) -> dict:
22 merged: dict = {}
23 for config in configs:
24 merged = deep_merge(merged, config)
25 return merged
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1Recursing on matching Mapping keys lets you merge arbitrarily nested structures without hand-writing each level.
  2. 2Deep-copying values keeps the original inputs immutable, avoiding shared-reference bugs across merges.
  3. 3Folding a merge over a sequence turns a two-argument combiner into a variadic one with a clear precedence order.

Related explainers

Share this explainer

Here's the card — post it anywhere.

How a recursive deep merge works in Python — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code