在Python中测试引用相等性

48 投票
3 回答
20601 浏览
提问于 2025-04-17 01:07

假设我在Python中有一个类,这个类里面定义了一个eq方法,用来比较属性是否相等:

class Foo(object):
    # init code...

    def __eq__(self, other):
        # usual eq code here....

那么我该如何比较两个Foo类的实例,看看它们是否是同一个对象呢?也就是说,测试一下它们是不是同一个实例?如果我这样做:

f1 = Foo()
f2 = Foo()
print f1 == f2

我得到的结果是True,尽管它们其实是不同的对象。

3 个回答

6

使用 is 关键字。

print f1 is f2

有一些有趣的事情(我认为这些是依赖于具体实现的,但在 CPython 中是正确的)与 is 关键字有关,那就是 None、True 和 False 都是单例实例。所以 True is True 会返回 True。

在 CPython 中,字符串也是被内部处理的,所以 'hello world' is 'hello world' 会返回 True(但在正常代码中不应该依赖这个)。

8

f1 is f2 用来检查两个引用是否指向同一个对象。简单来说,它实际上是在比较 id(f1) == id(f2) 的结果,id 是一个内置函数,它会返回一个整数,这个整数在对象的生命周期内是唯一的。

在 CPython 中,这个整数恰好是对象在内存中的地址,不过文档提到你应该假装不知道这一点,因为其他的实现可能会用不同的方法来生成这个 id。

83

那就是 is 操作符

print f1 is f2

撰写回答