函数写入同一个字典或根本不写入

Function writing to the same dictionary or just not writing in it at all

我正在做一个 Huffman 项目,我有一个特定功能的问题。基本上,您从树中创建字典以获取新字典,其中字母作为键,霍夫曼代码作为值(0 和 1)。

顺便说一句,整个程序实际上显然要长得多,但为了方便您,我只放置了非工作功能,因为其余功能都按预期工作。

而“错误”是,当我多次调用我的函数时,它只会写入同一个字典并替换一些相同的键。我尝试将 codes = {} 放入函数本身或作为 args 但它会 return 一个空字典。

这是代码:

codes = {}
def parcours(arbre, chemin=""):
    
    if arbre.gauche is None:
        codes[arbre.valeur] = chemin
    else:
        parcours(arbre.gauche, chemin+"0")
        parcours(arbre.droit, chemin+"1")
    return codes
        
    
    
print(parcours(creer_arbre(creer_liste(dict_exemple))))
print(parcours(arbre_huffman("testpy.txt")))

这是 returns :

{'b': '00', 'a': '01', 'd': '100', 'e': '1010', 'f': '1011', 'c': '11'}
{'b': '00', 'a': '01', 'd': '100', 'e': '101', 'f': '1011', 'c': '11', ' ': '000', 'p': '001', 'r': '010', 'o': '011', 'j': '100', 't': '110', 'T': '1110', 's': '1111'}

字母仅来自示例词典,但结果清楚地表明第二个 运行 的开头与第一个 运行 相同。

对不起,如果它是法语的,但它应该很容易理解,chemin 是“路径”。 Parcours 就像导航树,arbre 是树,valeur 是值。

如果您在函数外部定义 codes,则每个函数调用都会将其数据添加到同一个字典中。

您需要在函数内部定义 codes,并确保用递归调用的结果更新它。

def parcours(arbre, chemin=""):
    codes = {}
    if arbre.gauche is None:
        codes[arbre.valeur] = chemin
    else:
        codes.update(parcours(arbre.gauche, chemin+"0"))
        codes.update(parcours(arbre.droit, chemin+"1"))
    return codes