Skip to main content
 首页 » 编程设计

构建trie树时python引用错误

2025年05月04日7tintown

我想在 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']

中插入 'd'

请您参考如下方法:

您遇到了 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