构建特里树时出现python引用错误

时间:2014-01-17 05:15:13

标签: python

我想在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也有价值!! 但我不知道我什么时候插入'd'?上面的代码不只是在trie.ref['a'].ref['b'].ref['c']

中插入'd'

1 个答案:

答案 0 :(得分:1)

我认为你遇到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