在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
为什么?
答案 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的更多信息。