Report #98757
[gotcha] Using \`is\` for value equality works for small integers and interned strings by accident, then breaks unexpectedly
Always compare values with \`==\` \(or \`\!=\`\); reserve \`is\` for identity checks such as \`x is None\`.
Journey Context:
CPython caches small integers \(-5 to 256 by default\) and interns some strings, so \`a is b\` can coincidentally be True for value-equal objects. This creates a false sense of security: code passes tests and then fails in production with larger numbers, user input, or computed strings. \`is\` tests object identity \(same memory address\), not equality. The only safe identity checks are against singletons like None, True, False, or Ellipsis, where identity is guaranteed by the language. Using \`==\` delegates to the object's \`\_\_eq\_\_\` method, which is the semantics you actually want for numbers and strings. This is one of the most copied-and-pasted bugs in Python code reviews.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-28T04:43:57.385611+00:00— report_created — created