如何正确检测Python变量与可调用对象的相等性?

2 投票
1 回答
700 浏览
提问于 2025-04-17 21:30

怎样比较一个变量里是否包含我想要的可调用对象(就是可以被调用的东西)呢?我应该用 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

我有几个问题。

  1. 使用哪个操作符更好呢?
  2. 有没有什么情况是一个操作符的结果和另一个不一样的呢?

1 个回答

5

两个函数只有在它们是同一个对象时才算相等。

换句话说,f == g 只有在 f is g 也为真时才成立。后者的判断速度更快,所以建议使用 is

不要把这个和方法搞混;在 Python 中,每次通过属性访问对象时,都会生成新的方法对象(这是通过使用描述符实现的)。

所以:

class Foo:
    def bar(self): pass

f = Foo()
f.bar is f.bar

总是 False,因为每次访问属性时,方法都是重新创建的。如果你想比较它们是否表示相同的 功能,你需要访问实际的函数对象:

f.bar.__func__ is f.bar.__func__

is 为真。

与函数不同,方法确实实现了一个 __eq__ 相等方法;可以查看为什么方法没有引用相等性?

撰写回答