比较运算符 #

比较运算符用于比较两个值,返回布尔值 TrueFalse

一、基本比较运算符 #

1.1 运算符列表 #

运算符 名称 示例 结果
== 等于 5 == 5 True
!= 不等于 5 != 3 True
> 大于 5 > 3 True
< 小于 5 < 3 False
>= 大于等于 5 >= 5 True
<= 小于等于 5 <= 3 False

1.2 相等比较 #

python
# 数值相等
print(5 == 5)       # True
print(5 == 5.0)     # True(值相等)
print(5 == "5")     # False(类型不同)

# 字符串相等
print("hello" == "hello")  # True
print("Hello" == "hello")  # False(区分大小写)

# 列表相等
print([1, 2, 3] == [1, 2, 3])  # True
print([1, 2, 3] == [3, 2, 1])  # False(顺序重要)

# 字典相等
print({"a": 1} == {"a": 1})    # True
print({"a": 1} == {"a": 1.0})  # True(值相等)

1.3 不相等比较 #

python
# 数值不等于
print(5 != 3)       # True
print(5 != 5)       # False

# 字符串不等于
print("hello" != "world")  # True

# 使用 <>(Python 2语法,Python 3已移除)
# print(5 <> 3)  # SyntaxError in Python 3

1.4 大小比较 #

python
# 数值比较
print(5 > 3)        # True
print(5 < 3)        # False
print(5 >= 5)       # True
print(5 <= 4)       # False

# 字符串比较(字典序)
print("apple" < "banana")   # True
print("apple" < "Apple")    # False(小写字母在大写字母之后)
print("abc" < "abcd")       # True(较短的字符串较小)

# 列表比较(逐元素比较)
print([1, 2, 3] < [1, 2, 4])  # True
print([1, 2] < [1, 2, 3])     # True

二、链式比较 #

Python支持链式比较,使代码更简洁。

2.1 基本用法 #

python
x = 5

# 传统写法
print(x > 1 and x < 10)  # True

# 链式比较
print(1 < x < 10)        # True
print(1 < x <= 5)        # True
print(0 <= x < 10)       # True

# 多个比较
print(1 < x < 10 > 5)    # True
print(1 < 5 < 10 < 20)   # True

2.2 不同类型的链式比较 #

python
# 可以混合使用不同运算符
x = 5
print(1 < x == 5)        # True
print(1 < x != 10)       # True
print(x > 0 < 10)        # True(x > 0 and 0 < 10)

2.3 短路求值 #

python
x = 15

# 链式比较会短路求值
print(1 < x < 10)  # False(不计算中间部分)

# 实际执行过程
# 1 < 15 -> True,继续
# 15 < 10 -> False,停止

三、is 和 is not #

is 用于检查两个变量是否引用同一个对象。

3.1 基本用法 #

python
a = [1, 2, 3]
b = [1, 2, 3]
c = a

# == 比较值
print(a == b)       # True(值相等)

# is 比较身份(是否同一对象)
print(a is b)       # False(不同对象)
print(a is c)       # True(同一对象)

# is not
print(a is not b)   # True

3.2 小整数缓存 #

python
# Python缓存了小整数(通常是-5到256)
a = 256
b = 256
print(a is b)       # True

c = 257
d = 257
print(c is d)       # False(超出缓存范围)

# 字符串也有类似缓存
s1 = "hello"
s2 = "hello"
print(s1 is s2)     # True

# 动态创建的字符串可能不被缓存
s3 = "hel" + "lo"
print(s1 is s3)     # True(编译时优化)

s4 = "".join(["h", "e", "l", "l", "o"])
print(s1 is s4)     # False

3.3 None的比较 #

python
x = None

# 推荐:使用is检查None
print(x is None)       # True
print(x is not None)   # False

# 不推荐:使用==
print(x == None)       # True(但不推荐)

# 原因:==可能被重载
class MyNone:
    def __eq__(self, other):
        return True  # 总是返回True

obj = MyNone()
print(obj == None)     # True(被欺骗)
print(obj is None)     # False(正确的判断)

3.4 布尔值的比较 #

python
# True和False也是单例
print(True is True)    # True
print(False is False)  # True

# 但不推荐用is比较布尔值
flag = True
print(flag is True)    # True(可以工作)
print(flag == True)    # True(推荐)

# 更好的写法
if flag:
    print("flag为真")

四、in 和 not in #

in 用于检查成员关系。

4.1 列表中检查 #

python
fruits = ["apple", "banana", "orange"]

print("apple" in fruits)      # True
print("grape" in fruits)      # False
print("grape" not in fruits)  # True

4.2 字符串中检查 #

python
s = "Hello World"

print("World" in s)       # True
print("world" in s)       # False(区分大小写)
print("xyz" not in s)     # True

# 单字符检查
print("e" in s)           # True

4.3 字典中检查 #

python
person = {"name": "Tom", "age": 25}

# 检查键
print("name" in person)       # True
print("Tom" in person)        # False(不检查值)
print("address" not in person) # True

# 检查值
print("Tom" in person.values())    # True
print(25 in person.values())       # True

# 检查键值对
print(("name", "Tom") in person.items())  # True

4.4 集合中检查 #

python
numbers = {1, 2, 3, 4, 5}

print(3 in numbers)       # True
print(6 in numbers)       # False

# 集合的成员检查效率很高(O(1))

4.5 元组和range #

python
# 元组
coords = (10, 20, 30)
print(20 in coords)       # True

# range
print(5 in range(10))     # True
print(10 in range(10))    # False

五、不同类型的比较 #

5.1 数值类型之间 #

python
# 整数和浮点数可以比较
print(5 == 5.0)       # True
print(5 > 4.9)        # True
print(5 < 5.1)        # True

# 复数只能比较相等
print(1+2j == 1+2j)   # True
# print(1+2j > 2+3j)  # TypeError

5.2 字符串与数字 #

python
# 不同类型比较(Python 3)
# print(5 > "3")      # TypeError

# Python 2中可以比较,结果可能不符合预期
# Python 3中会抛出TypeError

5.3 序列类型之间 #

python
# 列表和元组可以比较
print([1, 2, 3] == (1, 2, 3))  # False(类型不同)
print([1, 2] < [1, 2, 3])      # True

# 不同序列类型比较(Python 3)
# print([1, 2] < (1, 2))       # TypeError

六、自定义比较 #

6.1 比较方法 #

python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __eq__(self, other):
        return self.age == other.age
    
    def __lt__(self, other):
        return self.age < other.age
    
    def __le__(self, other):
        return self.age <= other.age

p1 = Person("Tom", 25)
p2 = Person("Jerry", 30)

print(p1 == p2)  # False
print(p1 < p2)   # True

6.2 functools.total_ordering #

python
from functools import total_ordering

@total_ordering
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __eq__(self, other):
        return self.age == other.age
    
    def __lt__(self, other):
        return self.age < other.age

# 只需定义 __eq__ 和 __lt__,其他比较自动生成
p1 = Person("Tom", 25)
p2 = Person("Jerry", 30)

print(p1 <= p2)  # True
print(p1 > p2)   # False

七、比较运算符的返回值 #

7.1 总是返回布尔值 #

python
# 比较运算符总是返回True或False
result = 5 > 3
print(type(result))  # <class 'bool'>
print(result)        # True

# 可以直接用在条件中
if 5 > 3:
    print("5大于3")

7.2 在表达式中使用 #

python
# 比较结果可以赋值
is_adult = age >= 18

# 可以用在列表推导式
numbers = [1, 2, 3, 4, 5]
evens = [n for n in numbers if n % 2 == 0]

# 可以用在filter
filtered = filter(lambda x: x > 0, [-1, 0, 1, 2])

八、常见陷阱 #

8.1 浮点数相等 #

python
# 浮点数精度问题
a = 0.1 + 0.2
b = 0.3

print(a == b)  # False
print(a)       # 0.30000000000000004

# 解决方案:使用容差比较
def almost_equal(x, y, tolerance=1e-9):
    return abs(x - y) < tolerance

print(almost_equal(a, b))  # True

8.2 is 与 == 的区别 #

python
a = [1, 2, 3]
b = a[:]

print(a == b)   # True(值相等)
print(a is b)   # False(不同对象)

# 什么时候用is?
# 1. 检查None
if x is None:
    pass

# 2. 检查哨兵值
SENTINEL = object()
if value is SENTINEL:
    pass

8.3 链式比较的陷阱 #

python
x = 5

# 注意这个表达式
print(x > 0 < 10)    # True(x > 0 and 0 < 10)

# 不是
# print((x > 0) < 10)  # 等价于 True < 10 = True

# 另一个例子
print(False == False in [False])  # True
# 等价于 False == False and False in [False]
# 即 True and True = True

8.4 NaN的比较 #

python
import math

nan = float('nan')

print(nan == nan)      # False
print(nan != nan)      # True
print(math.isnan(nan)) # True(正确的检查方式)

九、总结 #

运算符 名称 用途
== 等于 比较值是否相等
!= 不等于 比较值是否不等
> 大于 比较大小
< 小于 比较大小
>= 大于等于 比较大小
<= 小于等于 比较大小
is 身份运算 检查是否同一对象
in 成员运算 检查是否包含

最佳实践:

  • 检查 Noneis None
  • 比较值用 ==
  • 检查成员用 in
  • 浮点数比较使用容差
最后更新:2026-03-16