使用 "is" 来检查变量中包含哪个函数是个好主意吗?



我有一个包含函数的变量。

def foo(x):
return x + 42
def bar(x):
return x - 42
my_var = foo

我想检查一下这个函数是否是某个函数。我应该使用is还是==

my_var == foo
my_var == bar

my_var is foo
my_var is bar

两者都符合我的期望。

它们对于函数对象来说是一样的。==运算符调用__eq__函数来执行比较。function对象未定义__eq__方法:

>>> def foo():
...   pass
... 
>>> foo.__eq__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute '__eq__'

因此,解释器使用PyObject:中的默认实现

res = (v == w) ? Py_True : Py_False;

其基本上是指针比较,基本上与is相同。

否,您应该使用==

一个好的经验法则是在执行is Noneis not None时只使用is,而不使用其他方法。在这种情况下,将函数is进行比较是可行的,但如果您尝试将类实例的方法与其本身进行比较,则会得到False(即使是在同一实例上(,而与==进行比较会返回您所期望的结果:

>>> class A:
...     def my_method(self):
...         pass
... 
>>> a = A()
>>> a.my_method is a.my_method
False
>>> a.my_method == a.my_method
True

最好避免记住这一点,并始终将函数与==进行比较。

看看这个问题:为什么不';t方法具有引用相等性?

Is检查对象的标识。如果将foo分配给myvar,则会创建一个别名,并且它们都具有相同的id(至少在函数的情况下(。

从数学角度检查两个函数的等价性需要检查这两个函数域和共域的等价性。

所以is更好。

最新更新