<p>如果尚未设置字典密钥,则这是针对<code>KeyError</code>的保护。您还可以使用标准库中collections模块中的defaultdict</p>
<P>考虑以下</P>
<pre><code>inventory = {}
addedItems = ['1', '2', '3']
addToInventory(inventory, addedItems)
</code></pre>
<p>即使库存为空,您也可以获得正确的输出。这是因为<code>setdefault</code>确保在密钥不存在时使用默认值创建密钥。它使您不必使用<code>if/then</code>语句来判断该键是否已在dict中</p>
<pre><code>{'1': 1, '2': 1, '3': 1}
</code></pre>
<p>现在,在不使用<code>setdefault</code>行的情况下尝试相同的函数</p>
<pre><code>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'
</code></pre>
<p>现在看看如果使用<code>defaultdict</code>会发生什么</p>
<pre><code>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})
</code></pre>