使用 "is" 检查变量中包含哪个函数是个好主意吗?
Is it a good idea to use "is" to check which function is contained in a variable?
我有一个包含函数的变量。
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
两者都 return 我所期望的。
是检查对象的身份。如果将 foo
分配给 myvar
,则会创建一个别名,并且它们都具有相同的 ID(至少在函数的情况下)。
从数学的角度检查 2 个函数的等价性需要检查两个函数的域和辅域的等价性。
所以is
更好。
它们对于函数对象来说是一样的。 ==
运算符调用 __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 None
或 is not None
时使用 is
而别处。在这种情况下,将 functions 与 is
进行比较是可行的,但是如果您尝试比较 method [=32] 的实例=] 本身你会得到 False
(即使在同一个实例上),而与 ==
returns 相比你期望的是:
>>> class A:
... def my_method(self):
... pass
...
>>> a = A()
>>> a.my_method is a.my_method
False
>>> a.my_method == a.my_method
True
最好避免记住这一点,并始终将函数与 ==
进行比较。
看到这个问题:Why don't methods have reference equality?
我有一个包含函数的变量。
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
两者都 return 我所期望的。
是检查对象的身份。如果将 foo
分配给 myvar
,则会创建一个别名,并且它们都具有相同的 ID(至少在函数的情况下)。
从数学的角度检查 2 个函数的等价性需要检查两个函数的域和辅域的等价性。
所以is
更好。
它们对于函数对象来说是一样的。 ==
运算符调用 __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 None
或 is not None
时使用 is
而别处。在这种情况下,将 functions 与 is
进行比较是可行的,但是如果您尝试比较 method [=32] 的实例=] 本身你会得到 False
(即使在同一个实例上),而与 ==
returns 相比你期望的是:
>>> class A:
... def my_method(self):
... pass
...
>>> a = A()
>>> a.my_method is a.my_method
False
>>> a.my_method == a.my_method
True
最好避免记住这一点,并始终将函数与 ==
进行比较。
看到这个问题:Why don't methods have reference equality?