如何正确检测Python变量与可调用对象的相等性?
怎样比较一个变量里是否包含我想要的可调用对象(就是可以被调用的东西)呢?我应该用 is
操作符还是 ==
操作符呢?
在下面的互动示例中,我定义了两个可调用对象,分别是 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
我有几个问题。
- 使用哪个操作符更好呢?
- 有没有什么情况是一个操作符的结果和另一个不一样的呢?
1 个回答
5
两个函数只有在它们是同一个对象时才算相等。
换句话说,f == g
只有在 f is g
也为真时才成立。后者的判断速度更快,所以建议使用 is
。
不要把这个和方法搞混;在 Python 中,每次通过属性访问对象时,都会生成新的方法对象(这是通过使用描述符实现的)。
所以:
class Foo:
def bar(self): pass
f = Foo()
f.bar is f.bar
总是 False
,因为每次访问属性时,方法都是重新创建的。如果你想比较它们是否表示相同的 功能,你需要访问实际的函数对象:
f.bar.__func__ is f.bar.__func__
is 为真。
与函数不同,方法确实实现了一个 __eq__
相等方法;可以查看为什么方法没有引用相等性?