【发布时间】:2015-04-20 22:13:59
【问题描述】:
Python 似乎从类方法的封闭范围中推断出一些 kwargs,我不知道为什么。我正在实现一个 Trie:
class TrieNode(object):
def __init__(self, value = None, children = {}):
self.children = children
self.value = value
def __getitem__(self, key):
if key == "":
return self.value
return self.children[key[0]].__getitem__(key[1:])
def __setitem__(self, key, value):
if key == "":
self.value = value
return
if key[0] not in self.children:
self.children[key[0]] = TrieNode()
self.children[key[0]].__setitem__(key[1:], value)
在倒数第二行,我创建了一个新的 TrieNode,大概是一个空的子字典。但是,当我检查生成的数据结构时,树中的所有 TrieNode 都使用相同的子字典。即,如果我们这样做:
>>>test = TrieNode()
>>>test["pickle"] = 5
>>>test.children.keys()
['c', 'e', 'i', 'k', 'l', 'p']
而 test 的子节点应该只包含指向新 TrieNode 的“p”。另一方面,如果我们进入该代码的倒数第二行并将其替换为:
self.children[key[0]] = TrieNode(children = {})
然后它按预期工作。那么,不知何故,self.children 字典被隐式地作为一个 kwarg 传递给 TrieNode(),但是为什么呢?
【问题讨论】:
标签: python dictionary trie