我在找一个算法,我不明白dict中为什么有值而没有值。我认为,似乎没有做任何事情来听写d
。
>>> def what(*words):
... d = {}
... print d
... for word in words:
... print 'word: ' + word
... curr = d
... for letter in word:
... curr = curr.setdefault(letter, {})
... curr = curr.setdefault('.', '.')
... print d
... print '?'
... print curr
... return 1
...
>>> what('foo')
{}
word: foo
{'f': {'o': {'o': {'.': '.'}}}}
?
.
1
d = dict()
-->;初始化一个空字典并将其绑定到名称d
;这样就有一个由名称d
引用的字典对象({}
)在外部for循环中
curr = d
-->;将另一个名称curr
绑定到同一对象。因此,名称(d
和curr
引用同一个对象)内部for循环 在第一次迭代中
letter = 'f'
在上面的陈述中有两件事正在发生
A)
curr.setdefault(letter, {})
-->;根据文档:因为,字母“f”不在初始字典对象中,它将初始对象变异为
{'f':{}}
,并返回值{}
,该值不是初始字典对象,而是由于setdefault语句而创建的新字典对象。此时,curr
和d
都引用了最初的dictionary对象,该对象后来变为{'f':{}}
。B)将名称
curr
重新分配到上述返回值。现在,名称curr
和d
引用不同的对象。d
是指对象{'f':{}}
,而curr
是指空字典对象,实际上是d['f']
的值。 这就是为什么在循环过程中,嵌套会发生在原始dictionary对象中。阅读^{} 的文档:它类似于
get
,但如果密钥不存在,则它也会被设置:稍微修改一下你的例子:
正如您所看到的
curr
更改,因为当调用setdefault
时,它有时(在您的示例中总是)创建一个新的dict
,并将其设置为curr
的值,而d
总是引用原始的dict
。正如您所看到的,它在循环之后被修改,因为它的值是{'f': {'o': {'o': {'.': '.'}}}}
,这与{}
非常不同。可能您的困惑是因为
curr = curr.setdefault(letter, {})
总是创建一个新的和空的dict
,然后将其分配给curr
(因此,对于每个字母,您将嵌套级别添加到原始dict
,而不是覆盖值)。请参阅:
如您所见,对于每个级别,
my_dict
都有一个新的嵌套级别。也许吧,但我只是猜测,你想得到类似
'foo' -> {'f': {}, 'o': {}}
的东西,在这种情况下,你应该:setdefault(key[, default)
来自the docs:
用法示例
在你的代码中
我认为您很困惑,因为
curr = curr.setdefault(letter, {})
总是创建一个新的且空的dict,然后将其分配给curr
。这意味着,不是重写值,而是为words
中的每个元素在原始dict中添加嵌套级别。我还认为,您希望用代码实现的是创建一个字典,将
words
中的每个元素都作为键,并将{}
作为值,这样您就可以使用下面使用dict comprehension的代码来实现它:注意:我添加了对
setdefault
的解释,因为您的问题已被特别针对本案例进行了查看,但我也想涵盖您的具体问题。相关问题 更多 >
编程相关推荐