【发布时间】:2015-11-14 16:58:59
【问题描述】:
我声明了三个MyClass 实例。我想将这些实例中的每一个存储在列表变量instances 中。在 instance 附加到 instances 之前,我仔细检查它是否已经在列表中。有趣的是,这三个实例似乎与 Python 完全相同。为什么会发生这种情况?我们应该知道什么才能避免将来发生此类意外?
instances=[]
for i in range(3):
instance=MyClass(i)
for each in instances:
if each==instance:
print 'THE SAME?', each.ID,'==', instance.ID
if instance not in instances:
print "Instance %s is not in instances"%instance.ID
instances.append(instance)
else:
print "Instance %s is already in instances"%instance.ID
index=instances.index(instance)
instanceFromList=instances[index]
print "COMPARE: instance.ID:", instance.ID, ' instanceFromList.ID:', instanceFromList.ID
print 'Number of instances stored:', len(instances)
输出:
Instance 0 is not in instances
THE SAME? 0 == 1
Instance 1 is already in instances
COMPARE: instance.ID: 1 instanceFromList.ID: 0
THE SAME? 0 == 2
Instance 2 is already in instances
COMPARE: instance.ID: 2 instanceFromList.ID: 0
Number of instances stored: 1
【问题讨论】:
-
in运算符检查 identity 然后 equality,在这种情况下它们是相等的。定义您的自定义__eq__和__ne__方法。使用方法:PyObject_RichCompareBool -
刚刚编辑了我的示例以使用
==运算符进行检查。它也会误导...... -
@Sputnix 为什么会产生误导?这就是列表的行为方式。两个空列表相等。它不会使用您添加的任意属性,除非您自己覆盖相等测试并告诉它这样做。
标签: python list class inheritance