Это защита от KeyError
, если ключ словаря еще не был установлен. Вы также можете использовать defaultdict из модуля коллекций в стандартной библиотеке.
Примите во внимание следующее
inventory = {}
addedItems = ['1', '2', '3']
addToInventory(inventory, addedItems)
Вы получите правильный вывод, даже если инвентарь был пуст. Это потому, что setdefault
гарантирует, что ключ будет создан со значением по умолчанию, если он еще не существует. Это избавляет вас от необходимости использовать оператор if/then
о том, находится ли ключ уже в диктанте.
{'1': 1, '2': 1, '3': 1}
Теперь попробуйте ту же самую функцию без строки setdefault
def addToInventory(inventory, addedItems):
for i in addedItems:
inventory[i] = inventory[i] + 1
return inventory
inventory = {}
addedItems = ['1', '2', '3']
addToInventory(inventory, addedItems)
=== Output: ===
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-137-8302116925c5> in <module>
6 inventory = {}
7 addedItems = ['1', '2', '3']
----> 8 addToInventory(inventory, addedItems)
<ipython-input-137-8302116925c5> in addToInventory(inventory, addedItems)
1 def addToInventory(inventory, addedItems):
2 for i in addedItems:
----> 3 inventory[i] = inventory[i] + 1
4 return inventory
5
KeyError: '1'
Теперь посмотрим, что произойдет, если вы используете defaultdict
.
from collections import defaultdict
def addToInventory(inventory, addedItems):
for i in addedItems:
inventory[i] = inventory[i] + 1
return inventory
inventory = defaultdict(int)
addedItems = ['1', '2', '3']
addToInventory(inventory, addedItems)
=== Output: ===
Out[143]: defaultdict(int, {'1': 1, '2': 1, '3': 1})