为什么这个键存在于空字典中?

时间:2017-11-06 16:31:01

标签: python dictionary

sumDict = {}
n = 1000
print(sumDict)
for c in range(1,n):
    for d in range(1,n):
        result = c**3 + d**3
        if (result in sumDict):
            #print(1729 in sumDict)     #always true
            sumDict[result] = sumDict[result].append((c,d))
        else:
            sumDict[result] = [(c,d)]

for key,val in sumDict.items():
    for pair in val:
        for pair in val:
            print(pair,pair)]]

我试图找到满足^ 3 + b ^ 3 = c ^ 3 + d ^ 3的所有整数组合。我将c ^ 3 + d ^ 3的结果映射到满足总和的对列表。我总是收到以下错误:

AttributeError:' NoneType'对象没有属性'追加'

经过进一步调查,由于某种原因,密钥1729始终存在于字典中(除非我遗漏了某些内容)。有人能告诉我发生了什么吗?

2 个答案:

答案 0 :(得分:1)

        sumDict[result] = sumDict[result].append((c,d))

append返回None,因此在执行此行后,sumDict[result]将引用None而不是它用来引用的列表。然后,下一次执行此行时,它将尝试在该None值上调用append,然后崩溃。

不要将append的结果分配给任何内容,只需将其调用即可。

        sumDict[result].append((c,d))

答案 1 :(得分:1)

字典根本不是空的。你的问题出现在这里:

sumDict[result] = sumDict[result].append((c,d))

此处设置sumDict[result]None,因为list.append()的返回值为None。下次通过列表时,result位于字典中,但与其关联的值为None,您无法附加到None

相反,只需写下:

sumDict[result].append((c,d))

或者更好的是,完全删除if语句,然后写下:

sumDict.setdefault(result, []).append((c, d))