簡體   English   中英

構建特里樹的Python參考錯誤

[英]python reference error in building trie tree

我想在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也很有價值! 但是我不知道何時在trie中插入'd'嗎? 上面的代碼trie.ref['a'].ref['b'].ref['c']只是在trie.ref['a'].ref['b'].ref['c']插入'd'

我認為您在使用可變默認參數時遇到了問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM