Python对象比较,以为我没错

时间:2018-01-18 12:25:40

标签: python

我需要比较两个对象实例的相等性,通常我想用is时这样做;然而,经过几个小时的调试,有些代码失败了,有时我发现了这个。只是我调试的代码片段。

print "EVENT OBJECT:", id(event.source), "AND BINDING COMPONENT:", id(self.component), "IS THE SAME:", event.source is self.component

输出:

  

事件对象:4和绑定组件:4是相同的:错误

但是,请使用==,例如:

print "EVENT OBJECT:", id(event.source), "AND BINDING COMPONENT:", id(self.component), "IS THE SAME:", event.source == self.component

输出:

  

事件对象:4和绑定组件:4是相同的:真实

我追求的结果是第二个输出。

任何可以解释的人?以为我使用is做对了。我是Python的新手,几个月前才开始使用.Net和C#。

编辑:

不是this的重复,因为我认为我确实知道is==之间的区别。事实上,我确实阅读了其他帖子,他们似乎没有回答我关于为什么帖子中的代码表现得像它的问题。

更新

这是我存储组件的 init 方法的片段。

def __init__(self, component, *bindings):

    self.__dict__['component'] = component
    print "COMPONENT ID:", hex(id(component)), "COMPONENT IN SELF ID", hex(id(self.component))
    self.__dict__['_bindings'] = bindings

输出:

  

COMPONENT ID:自身ID 0x18中的0x18组件

然后在事件处理程序中:

print "EVENT OBJECT:", hex(id(event.source)), "AND BINDING COMPONENT:", hex(id(self.component)), "IS THE SAME:", event.source is self.component

我得到了这个输出:

  

事件对象:0x18和绑定组件:0x18是相同的:错误

1 个答案:

答案 0 :(得分:-1)

is运算符仅在两个对象指向同一变量时才返回True。考虑以下情况:

>>> x = [5, 2, 1]
>>> print(hex(id(x)))
'0x7fcefeb45bc8'
>>> y = [5, 2, 1]
>>> print(hex(id(y)))
'0x7fcefeb45b88'
>>> print x is y
False
>>> z = y
print(hex(id(z)))
'0x7fcefeb45bc8'
>>> print y is z
True