首页 > 解决方案 > 使用来自同一类的字典成功地对对象求和/它有效,但正在寻找解释

问题描述

我正在寻求好人的帮助

为什么 .copy() 必须在 __add__ 方法内?没有它就行不通。

class Traveler:
    def __init__(self):
        self.inventory = {}

    def add(self, item):
        self.inventory[item.lower()] = self.inventory.setdefault(item.lower(), 0) + 1

    def __add__(self, *backpacks):
        total = self.inventory.copy() # total = self.inventory ?
        for back in backpacks:
            for item in back.inventory:
                total[item] = total.setdefault(item, 0) + back.inventory[item]
        return total

backpack = Traveler()
backpack_2 = Traveler()
backpack.add('flashlight')
backpack.add('water')
backpack.add('food')
backpack.add('knife')

backpack_2.add('flashlight')
backpack_2.add('water')
backpack_2.add('knife')
backpack_2.add('food')

all_items = backpack + backpack_2

print(f"backpack = {backpack.inventory}")
print(f"backpack 2 = {backpack_2.inventory}")
print(f'All items {all_items}')

使用 .copy() 函数正确输出:

backpack = {'flashlight': 1, 'water': 1, 'food': 1, 'knife': 1}
backpack 2 = {'flashlight': 1, 'water': 1, 'knife': 1, 'food': 1}
All items {'flashlight': 2, 'water': 2, 'food': 2, 'knife': 2}

没有此功能的错误输出:

backpack = {'flashlight': 2, 'water': 2, 'food': 2, 'knife': 2} # Why it is doubled ?
backpack 2 = {'flashlight': 1, 'water': 1, 'knife': 1, 'food': 1}
All items {'flashlight': 2, 'water': 2, 'food': 2, 'knife': 2}

标签: python-3.xfunctiondictionary

解决方案


=在 Python 中,当您使用 " " 运算符将对象(在您的情况下为字典)分配给变量时,它采用了引用,而不是它的副本。

所以当你在做的时候total = self.inventorytotalself.inventory 都是同一个对象

self.inventory.copy()是否创建了一个新对象,所以一切都按预期工作。


推荐阅读