如果变量包含我想要的可调用对象,比较的正确方法是什么?我应该使用is
运算符还是==
运算符?
在以下交互式会话中,我定义了两个callables f
和g
。我将一个分配给变量a
,将另一个分配给变量b
。
现在,当我想检查a
是否与f
相同时,a == f
和a is f
都有效。
>>> def f():
... pass
...
>>> def g():
... pass
...
>>> a = f
>>> b = g
>>> a == f
True
>>> a is f
True
>>> a == g
False
>>> a is g
False
>>> b == f
False
>>> b is f
False
>>> b == g
True
>>> b is g
True
我的问题。
答案 0 :(得分:3)
如果它们是同一个对象,则两个函数只相等。
换句话说,如果f == g
也为真,则f is g
仅 为真。后者更快,所以只需使用is
。
不要将此与方法混淆;每次通过属性访问(通过使用descriptors)访问对象时,Python都会生成新的方法对象。
所以:
class Foo:
def bar(self): pass
f = Foo()
f.bar is f.bar
始终为False
,因为方法是在每个属性访问时创建的新方法。如果你想比较它们是否传达相同的函数,你需要访问实际的函数对象:
f.bar.__func__ is f.bar.__func__
是真的。
与函数不同,方法确实实现了__eq__
等式方法;见Why don't methods have reference equality?