Vì CPython cấp phát sẵn và dùng chung các object số nguyên nhỏ trong khoảng -5 đến 256.
Với giá trị nằm ngoài khoảng đó, mỗi lần tạo là một object mới nên is (so sánh identity) trả về False, dù == (so sánh giá trị) vẫn True.
python
a, b = 256, 256
a is b # True — cached object
x, y = 257, 257
x is y # False — two distinct objects
x == y # TrueĐây là chi tiết cài đặt của CPython, không phải quy tắc ngôn ngữ: chạy trong REPL và chạy trong cùng một file có thể ra kết quả khác nhau (compiler gộp hằng số trong cùng code object). PyPy hay phiên bản khác có quyền làm khác.
Chốt cách dùng:
- == cho mọi so sánh giá trị (số, chuỗi, list...).
- is chỉ dùng với singleton: is None, is True/False, và sentinel tự định nghĩa.
Từ Python 3.8, viết if x is 257 sẽ bị cảnh báo SyntaxWarning: "is" with a literal.