在Python中测试引用相等性

时间:2011-09-01 17:29:10

标签: python reference equality

假设我在Python中有一个类,它具有为比较属性而定义的eq方法:

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

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

如何比较两个Foo实例的参考相等性(即如果它们是同一个实例则测试)?如果我这样做:

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

即使它们是不同的对象,我也是真的。

3 个答案:

答案 0 :(得分:46)

那是is运营商

print f1 is f2

答案 1 :(得分:3)

f1 is f2检查两个引用是否属于同一个对象。在引擎盖下,这将使用id(f1) == id(f2)内置函数比较id的结果,该函数返回一个保证对象唯一的整数(但仅在对象的生命周期内)。

在CPython下,这个整数碰巧是内存中对象的地址,虽然文档提到你应该假装你不知道(因为其他实现可能有其他生成id的方法)。

答案 2 :(得分:2)

使用is关键字。

print f1 is f2

使用is关键字的一些有趣的东西(我认为是依赖于实现的,但在CPython中是正确的)是None,True和False都是单例实例。因此True is True将返回True。

字符串也在CPython中实现,因此'hello world' is 'hello world'将返回True(你不应该在普通代码中依赖它)。