测试Python变量和可调用之间的相等性的正确方法是什么?

时间:2014-03-09 10:59:52

标签: python python-3.x

如果变量包含我想要的可调用对象,比较的正确方法是什么?我应该使用is运算符还是==运算符?

在以下交互式会话中,我定义了两个callables fg。我将一个分配给变量a,将另一个分配给变量b

现在,当我想检查a是否与f相同时,a == fa 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. 使用一个运算符比另一个运算符更好吗?
  2. 是否存在一个运营商产生的结果与另一个运营商不同的情况?

1 个答案:

答案 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?