为何Pylint建议将`a == True`改为`a is True`?
关于Pylint建议
a is True的原因解析 问题中的代码
def greater(n): if n > 3: res = True else: res = False return res a = greater(5) print(hex(id(a))) print(hex(id(True))) b = True print(hex(id(b))) if a == True: print('yes') else: print('no')
Pylint提示信息
pylint_example.py:16:4: C0121: Comparison 'a == True' should be 'a is True' if checking for the singleton value True, or 'a' if testing for truthiness (singleton-comparison)
1. Python中布尔值是单例对象
Python语言规范明确规定,True和False是唯一的单例实例。不管是在函数内部返回True,还是直接赋值b = True,它们指向的都是同一个内存地址——这不是偶然的测试结果,而是语言层面的硬性规定。所以用a is True检查变量是否就是True这个实例,完全安全,不会出现地址不同的情况。
2. Pylint给出两种建议的场景
- 用
a is True的场景:如果你需要严格确认变量的值就是True这个布尔单例,而非其他等价于“真”的值(比如自定义类实例重载__eq__方法后,可能和True相等但本身不是布尔类型),此时is比==更准确——==仅判断值相等,is判断的是身份(内存地址)相等。 - 直接用
if a:的场景:如果你的目的只是检查变量的真值性(只要是“真”的状态即可,比如非零整数、非空列表等都属于truthy值),直接写if a:是Python的惯用写法,比a == True或a is True更简洁且符合Pythonic风格。
3. 关于“不可变变量内存地址”的误区
你提到“不能假设不可变变量会拥有相同内存地址”,这对普通不可变类型(比如字符串、整数)是成立的(比如大整数可能不会复用内存),但布尔值是特殊情况——Python将True和False设计为全局单例,这是语言规范的一部分,不属于“优化级别的内存复用”,所以不存在地址不同的风险。
内容的提问来源于stack exchange,提问作者Chungji
相关产品推荐
相关产品推荐

