2015-12-21 63 views
0

在调试我的作业时,我意识到我需要使用deepcopy复制字典。为什么包含实例的字典的深层副本的结果与另一个包含列表的字典的深层副本不同?

我预计deepcopy给我类似的结果(用列表的字典打交道时,这是真的):

import copy 

dict3 = {1 : [1,2,3], 2 : [1,2]}  
dict4 = copy.deepcopy(dict3)   

print dict3       # {1: [1, 2, 3], 2: [1, 2]} 
print dict4       # {1: [1, 2, 3], 2: [1, 2]} 

print dict3 == dict4    # True 

然而,我发现这样的:

import copy 

class Fruit(object): 
    def __init__(self, name, color): 
     self.name = name 
     self.color = color 

    def __repr__(self): 
     return self.color 

# Building dict1 
dict1 = {} 
dict1['apple'] = Fruit('apple', 'red') 
dict1['banana'] = Fruit('banana', 'yellow') 

# Deep copy dict1 and assign it to dict2 
dict2 = copy.deepcopy(dict1) 

print dict1   # {'apple': red, 'banana': yellow} 
print dict2   # {'apple': red, 'banana': yellow} 

print dict1 == dict2 # False 

如果我想要一个在最后的print声明中给我一个True的副本,我该怎么办?

+3

您还没有实现在''__eq__' ... Fruit' – jonrsharpe

+0

@jonrsharpe我不知道,哈哈。非常感谢! –

回答

1

的问题是,在Python,默认情况下,一个对象的副本并不比等于原始,即使他们是“相同的”,例如:

class Fruit(object): 
    def __init__(self, name, color): 
     self.name = name 
     self.color = color 

    def __repr__(self): 
     return self.color 

print Fruit("apple", "red") == Fruit("apple", "red") 
# False 

为了解决这个问题,你需要告诉Python的Fruit类型的对象应比较,例如:

class Fruit(object): 
    def __init__(self, name, color): 
     self.name = name 
     self.color = color 

    def __repr__(self): 
     return self.color 

    def __eq__(self, other): 
     try: 
      if (self.name == other.name) and (self.color == other.color): 
       return True 
      else: 
       return False 
     except AttributeError: 
      return False 
+0

非常感谢! –

+1

只需添加一个链接到内置的比较规则。很高兴知道Python可以比较什么。对于其他所有你提供的__eq__,如Bi Rico的答案所示。 https://docs.python.org/3/reference/expressions.html#value-comparisons – VPfB