我想在 python 中构建一个简单的 trie 树,这是我的代码
class Node:
def __init__(self,ref={},num=0):
self.ref = ref
self.num = num
def makeTrie(node,s):
node.ref.setdefault(s[0],Node())
if len(s) == 1:
node.ref[s[0]].num += 1
return
makeTrie(node.ref[s[0]],s[1:])
trie = Node()
makeTrie(trie,'abcd')
print trie.ref['d'].num
print trie.ref['a'].ref['b'].ref['c'].ref['d'].num
我很困惑,语句print trie.ref['d'].num 也有值(value)!! 但是我不知道什么时候在 trie 中插入 'd'?上面的代码不只是在 trie.ref['a'].ref['b'].ref['c']
请您参考如下方法:
您遇到了 mutable default arguments 的问题,我认为。
在 Node 的初始化程序中,您有 ref={}。但是 {} 是一个 dict,因此是一个可变对象。因此,每次调用 Node() 都会调用初始化器,它会改变相同的 ref 字典。
修复(我认为):
class Node:
# vvvv
def __init__(self, ref=None, num=0):
if ref is None: # <--
ref = {} # <--
self.ref = ref
self.num = num
def makeTrie(node,s):
node.ref.setdefault(s[0],Node())
if len(s) == 1:
node.ref[s[0]].num += 1
return
makeTrie(node.ref[s[0]],s[1:])
trie = Node()
makeTrie(trie,'abcd')
try:
print(trie.ref['d'].num)
except KeyError:
print('KeyError occurred!')
print(trie.ref['a'].ref['b'].ref['c'].ref['d'].num)
结果:
KeyError occurred!
1
