2015-05-17 31 views
-1

我看着这个代码:Python的特里实现,为什么创建临时变量

>>> _end = '_end_' 
>>> 
>>> def make_trie(*words): 
...  root = dict() 
...  for word in words: 
...   current_dict = root 
...   for letter in word: 
...    current_dict = current_dict.setdefault(letter, {}) 
...   current_dict = current_dict.setdefault(_end, _end) 
...  return root 
... 
>>> make_trie('foo', 'bar', 'baz', 'barz') 
{'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}}, 
     'z': {'_end_': '_end_'}}}, 
'f': {'o': {'o': {'_end_': '_end_'}}}} 

从这个链接:How to create a TRIE in Python,但我不太明白为什么笔者创建的临时变量current_dict因为你永远只是编辑叫根字典...

+0

我删除了我完全错误的代码如何工作的想法,对不起!我仍然认为这个问题属于codereview.stackexchange.com。 – GreenAsJade

+0

我应该问关于未来实施的问题吗?如果是这样,为什么? –

+0

StackOverflow是关于代码特定问题的具体问题(阅读[帮助]了解更多详情)。 CodeReview用于征求关于如何改进代码的输入以及以某些方式处理事情的基本原理。 – GreenAsJade

回答

2

我不太明白为什么笔者创建的临时变量current_dict因为你总是只需要编辑称为根字典...

不,你不是。如果它总是编辑根词典,结果会非常不同。每次执行循环内的分配时间:

...   current_dict = root 
...   for letter in word: 
...    current_dict = current_dict.setdefault(letter, {}) # this one 

current_dict被设定为一个字典一个级别上的这个循环遍历线索,用setdefault根据需要建立缺少的部分。我们必须将setdefault的结果指定为current_dict以继续保持最低水平,而不是停留在顶级水平,因此我们必须使用单独的current_dict变量而不是root,因此我们可以在完成后指定current_dict = root以返回顶层用一个词。

+0

为什么'current_dict'设置为一个字典更进一步?我不明白这是怎么发生的。 –

+0

@KevinZhao:你知道'setdefault'返回什么吗? – user2357112

+0

根据TutorialsPoint(http://www.tutorialspoint.com/python/dictionary_setdefault.htm),“此方法返回字典中可用的键值,如果给定的键不可用,那么它将返回提供的默认值。”所以基本上current_dict将等于第一次之后的新字典,然后当我再次运行setdefault行时,我正在设置新字典的键和值,这是一个级别,是吗? –