在Python中测试引用相等性
假设我在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