我有一个包含函数的变量。
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
都返回我的期望。
答案 0 :(得分:4)
对于功能对象,它们是同一回事。 ==
运算符调用__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
基本相同。
答案 1 :(得分:1)
否,您应该使用==
。
一个好的经验法则是仅在进行is
或is None
时使用is not None
,而在其他地方则不要使用。在这种情况下,将 function 与is
进行比较是可行的,但是如果您尝试将类实例的 method 与自身进行比较,则会得到{{ 1}}(即使在同一实例上),而与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
进行比较。
答案 2 :(得分:0)
正在检查对象的身份。如果将foo
分配给myvar
,则会创建一个别名,并且它们都具有相同的ID(至少对于函数而言)。
从数学的角度检查2个函数的等效性需要检查两个函数的域和共域的等效性。
所以is
更好。