python-3.x - 使用来自同一类的字典成功地对对象求和/它有效,但正在寻找解释
问题描述
我正在寻求好人的帮助
为什么 .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 中,当您使用 " " 运算符将对象(在您的情况下为字典)分配给变量时,它采用了引用,而不是它的副本。
所以当你在做的时候total = self.inventory
,total
和self.inventory
都是同一个对象。
你self.inventory.copy()
是否创建了一个新对象,所以一切都按预期工作。
推荐阅读
- elixir - 如何根据是否选中复选框来显示/隐藏表单的某些部分
- amazon-web-services - 查看私有 S3 存储桶/文件夹中的文件
- c# - 如何使用参数和返回值创建 FUNC 动作列表
- vuejs2 - How to properly handle non-existent named route?
- xml - 在文件中附加带有内容的 xml 标记
- symfony4 - Display only form item from a CollectionType with error
- php - 如何在 PHP 中传递 CURL url
- javascript - Assign an imported function as a class method?
- javascript - 传递一个调用函数的 => 而不是仅仅传递函数本身
- ruby-on-rails - 如何在Rails中构造form_for,可以同时创建belongs_to和has_many关联