说我有一个应用程序列表,称为自定义对象。 我决定对原始应用程序列表进行深度复制,以便可以有一个列表像一个可用应用程序池。 要分配应用程序,我随机选择池的一个子集,然后在原始列表中找到那些应用程序,以便我可以更新其信息。 然后,从池中删除分配的应用程序。 但是,由于某些原因,这些应用程序永远无法在原始列表中找到:

list1 = [App1,App2,App3,App4,App5]
pool = copy.deepcopy(list1)
num_apps = rand.randrange(0,5)
random.shuffle(pool)
selected_apps = copy.deepcopy(pool[:num_apps])
for app in selected_apps:
    locn = list1.index(app)
    print locn

上面的代码实际上将返回ValueError,表明在selected_apps中找不到项目。 错误是由于我正在制作包含非Python或其他对象的对象的列表的深层副本导致的?

===============>>#1 票数:0

当使用list.index它使用比较运算符( == )检查项目是否相同,而从文档中依次使用__eq__方法:

用户定义的类默认具有__eq__()__hash__()方法; 使用它们, 所有对象比较不相等(除了它们本身),并且x.__hash__()返回适当的值,以使x == y表示x is yhash(x) == hash(y)

您可以通过以下方式证明这一点:

>>> class A(object):
...     def __init__(self):
...         self.x = 0
... 
>>> a = A()
>>> a.x = 5
>>> b = a
>>> b == a
True
>>> c = copy.deepcopy(a)
>>> c == a
False

在CPython中, id()返回对象的内存地址,因此__eq__如果id匹配,则返回true:

>>> id(a) 
140389541757224
>>> id(b)
140389541757224
>>> id(c)
140389541757336

因此,您只需要实现__eq__方法和__ne__

比较运算符之间没有隐含的关系。 x==y的真相并不意味着x!=y为假。 因此,在定义__eq__() ,还应定义__ne__() ,以使运算符的行为符合预期。

>>> class A(object):
...     def __init__(self):
...         self.x = 0
...     def __eq__(self, o):
...         return self.x == o.x
...     def __ne__(self, o):
...         return self.x != o.x
... 
>>> a = A()
>>> a.x = 5
>>> b = a
>>> c = copy.deepcopy(a)
>>> d = A()
>>> d.x = 4
>>> a == b
True
>>> a == c
True
>>> a is b
True
>>> a is c
False
>>> a == d
False

另请注意:

如果一个类没有定义__eq__()方法,那么它也不应该定义__hash__()操作。 如果它定义__eq__()而不是__hash__() ,则其实例将不能用作可散列集合中的项目

  ask by Rachel Green translate from so

未解决问题?本站智能推荐:

关注微信公众号