我开始学习Python,并且遇到了一段代码,我希望你们中的一位可以帮助我理解。
AVAudioSession
结果:
from collections import defaultdict
dd_dict = defaultdict(dict)
dd_dict["Joel"]["City"] = "Seattle"
我遇到问题的部分是第三行。有人可以向我解释这里发生了什么吗?
答案 0 :(得分:3)
来自documentation of defaultdict
:
如果default_factory不是None,则不带参数调用它以提供给定键的默认值,该值将插入键的字典中并返回。
由于"Joel"
不存在作为键,dd_dict["Joel"]
部分会创建一个空字典作为键"Joel"
的值。以下部分["City"] = "Seattle"
就像添加一个普通的键值对一个字典 - 在本例中是dd_dict["Joel"]
字典。
答案 1 :(得分:2)
第三行在字典中插入字典。通过在默认dict中使用dict作为默认值,您将告诉python使用空dict初始化每个新的dd_dict值。上面的代码相当于
dd_dict["Joel"] = {}
dd_dict['Joel"]["City"] = "Seattle"
如果你没有使用默认dict,第二行会引发一个关键错误。因此,默认dicts是一种通过初始化数据结构的默认值来避免此类错误的方法。
答案 2 :(得分:1)
第一个参数提供default_factory的初始值 属性;它默认为None。如果default_factory不是None,则为 不带参数调用以提供给定键的默认值, 此值将插入到键的字典中,并返回。
dd_dict = defaultdict(dict)
dd_dict["Joel"]["City"] = "Seattle"
在您的情况下,当您致电dd_dict["Joel"]
时,dd_dict
中没有此类密钥,这会引发KeyError
异常。 defaultdict
具有__missing__(key)
协议来处理此错误,当它找不到密钥时,它会调用default_factory
而不带参数来为给定密钥提供默认值。
所以当你拨打dd_dict["Joel"]
时,这会给你一个字典{}
,然后你将项目["City"] = "Seattle"
添加到空字典中,有点像:
{}["City"] = "Seattle"
答案 3 :(得分:0)
当访问密钥并丢失密钥时,将访问__missing__
方法。
对于常规dict
,会引发KeyError
对于defaultdict
,您创建并访问作为参数传递的对象。
如果您创建了defaultdict(list)
,并尝试访问丢失的密钥,则会返回一个列表。
示例:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['missing']
[]
答案 4 :(得分:0)
当您访问未退出的defaultdict的密钥时,您将获得所提供的功能返回的内容。
在您的情况下,您提供了dict
,因此您获得了一个新的空字典:
>>> dict()
{}
>>> from collections import defaultdict
... dd_dict = defaultdict(dict)
...
>>> dd_dict['Joel']
{}
现在,您将键值对添加到此词典中:
>>> dd_dict["Joel"]["City"] = "Seattle"
"Joel" : { "City" : Seattle"}}
答案 5 :(得分:0)
defaultdict(dict)返回一个字典对象,如果用一个尚未存在的键索引它,它将返回一个空字典值:
>>> from collections import defaultdict
>>> dd_dict = defaultdict(dict)
>>> dd_dict
defaultdict(<class 'dict'>, {})
>>> dd_dict["Joel"]
{}
>>> dd_dict["anything"]
{}
>>> dd_dict[99]
{}
所以第三行在dd_dict中创建一个键值对(&#34; Joel&#34;,{}),然后设置(&#34; City&#34;,&#34; Seattle&#34; )空字典上的键值对。
它相当于:
>>> dd_dict = defaultdict(dict)
>>> dd_dict["Joel"] = {}
>>> dd_dict
defaultdict(<class 'dict'>, {'Joel': {}})
>>> dd_dict["Joel"]["City"] = "Seattle"
>>> dd_dict
defaultdict(<class 'dict'>, {'Joel': {'City': 'Seattle'}})