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

Lon*_*ner 2 python python-3.x

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

在下面的交互式会话中,我定义了两个可调用对象,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
Run Code Online (Sandbox Code Playgroud)

我的问题。

  1. 使用一种运算符比另一种更好吗?
  2. 是否存在一个运算符会产生与另一个运算符不同的结果的情况?

Mar*_*ers 5

仅当两个函数是同一个对象时,它们才相等。

换句话说,f == g只有当也为真时才f is g真。后者更快,所以只需使用is.

不要将其与方法混淆;每次通过属性访问(通过使用描述符)访问对象时,Python 都会生成新的方法对象。

所以:

class Foo:
    def bar(self): pass

f = Foo()
f.bar is f.bar
Run Code Online (Sandbox Code Playgroud)

总是False因为方法是在每次属性访问时创建新的。如果您想比较它们是否传达相同的函数,您需要访问实际的函数对象:

f.bar.__func__ is f.bar.__func__
Run Code Online (Sandbox Code Playgroud)

真的。

与函数不同,方法确实实现了__eq__相等方法;请参阅为什么方法没有引用相等性?