파이썬(Python)에는 True, False, None, __debug__, Ellipsis(...), NotImplemented 등 미리 정의된 6가지 상수가 존재합니다. 하지만 이 상수들은 이름 해석, 대입 규칙, 그리고 불변성(immutability) 면에서 제각기 다른 방식으로 동작하여 개발자들에게 혼란을 줄 수 있습니다. 예를 들어, True, False, None은 일반적인 식별자가 아닌 어휘 토큰(lexical token)으로 분류되어 x.True와 같은 속성 접근 시 SyntaxError를 발생시킵니다.
각 상수의 동작 방식은 매우 다릅니다. __debug__는 일반 식별자처럼 속성을 조회할 수 있지만, 직접 대입할 수 없는 유일한 식별자이며, 파이썬을 최적화 모드(-O)로 실행하면 True에서 False로 값이 바뀝니다. 반면, Ellipsis와 NotImplemented는 일반 내장 이름(built-in name)으로 분류되어 전역 변수나 builtins 모듈 수정을 통해 덮어쓸 수 있습니다. 그러나 어휘 토큰인 ...은 이러한 변경에 영향을 받지 않습니다. 심지어 setattr(builtins, 'True', 67)과 같이 builtins 모듈의 값을 변경하더라도, 코드 내에서 사용되는 True와 __debug__의 값은 원래대로 유지됩니다. 이는 키워드가 컴파일 시 바이트코드(bytecode)에 상수로 박혀 내장 이름 공간과 분리되기 때문입니다.
이러한 불일치는 파이썬의 오랜 역사와 설계 과정에서 비롯된 결과입니다. 초기 파이썬 2.x 버전에서는 True와 False가 재할당 가능한 일반 내장 객체였으며, 3.0 버전이 되어서야 실제 키워드로 변경되었습니다. None 역시 2.4부터 재할당이 금지되었습니다. 내장 이름 공간에 해당 항목이 남아있는 것은 getattr, dir, vars와 같은 인트로스펙션(introspection) 기능이 계속 작동하도록 하기 위함입니다. 또한, x.True가 SyntaxError를 내는 것은 불리언 리터럴이 정수, 문자열, 리스트 리터럴과 마찬가지로 직접 속성 접근의 대상이 될 수 없기 때문입니다. 결국 파이썬의 상수들은 효율성, 하위 호환성, 그리고 언어의 진화 과정에서 발생한 복합적인 설계 결정의 흔적을 담고 있습니다.