You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:20:45