为什么Python的copy.copy()返回的对象不等于原始对象?

时间:2015-07-11 05:59:21

标签: python copy

在Python中,如果我复制列表或字典,则复制的实例等于原始实例:

>>> a = [1, 2, 3]
>>> b = copy.copy(a)
>>> a == b
True
>>> a = {"a":1, "b":2}
>>> b = copy.copy(a)
>>> a == b
True

但是如果我复制一个对象,结果就不等于原始对象:

>>> class MyClass():
...     def __init__(self, name):
...             self._name= name
...
>>> a = MyClass('a')
>>> b = copy.copy(a)
>>> a == b
False

为什么?

1 个答案:

答案 0 :(得分:6)

通过调用__eq__()函数来检查Python中对象的等同性。

示例:

>>> class CA:
...     def __eq__(self, other):
...             print("Equals")
...             return True
...
>>> c = CA()
>>> b = CA()
>>> c == b
Equals
True

这是因为list相等性取决于元素,而不是存储列表的实际内存位置(引用),也就是说,它们可以是两个不同的列表引用,但如果它们具有相同的元素按照相同的顺序,列表是相同的。

示例:

>>> l = [1,2]
>>> l1 = [1,2]
>>> id(l)
2830504
>>> id(l1)
2831864
>>> l == l1
True

但是自定义类,你没有覆盖__eq__(),因此它将调用父类的__eq__(),即object,并根据引用检查相等性。 / p>

当你执行copy.copy()时,它会进行浅层复制,也就是说,它会创建一个新实例,该对象的所有成员(属性等)保持不变。因此,它们是不相等的(因为它们是不同的参考/不同的实例)。

如果您希望MyClass根据self._name检查相等性,则必须覆盖__eq__()函数。

您可以找到有关比较here的更多信息。