比较变量是否包含我想要的可调用对象的正确方法是什么?我应该使用is运算符还是==运算符?
在下面的交互式会话中,我定义了两个可调用对象,f和g。我将一个分配给变量a,另一个分配给变量b。
现在,当我想检查是否a相同时f,两者a == f都a 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)
我的问题。
仅当两个函数是同一个对象时,它们才相等。
换句话说,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__相等方法;请参阅为什么方法没有引用相等性?
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |