Report #99194
[gotcha] Mutable default argument is shared and mutated across function calls
Use \`None\` as the sentinel default and create the mutable object inside the function body; for classes use \`dataclasses.field\(default\_factory=...\)\`.
Journey Context:
Python evaluates default arguments once when the function is defined, not on each call, so \`def f\(x=\[\]\)\` reuses the exact same list object. The common wrong fix is to write \`if x is None: x = \[\]\` but forget that pattern for dicts or sets. The \`None\` sentinel works because \`None\` is a singleton and the reassignment happens in the caller's scope. If you need to distinguish 'not passed' from 'passed None', use a private \`\_MISSING = object\(\)\` sentinel. For dataclasses, \`default=list\` shares one list across all instances, while \`default\_factory=list\` creates a fresh one per instance. This is not a bug; it is a documented evaluation-order consequence that every Python implementation shares.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-29T04:43:56.234862+00:00— report_created — created