Thinkpython练习让我对方法感到困惑(练习11.2)

Thinkpython exercise leaves me puzzled about methods (Exercise 11.2)

"阅读字典方法 setdefault 的文档并使用它编写更简洁的版本 invert_dict"

一个看似简单的练习。但这让我对 python.

中方法的交互感到困惑

解决方法是:

    inverse = dict()
    for key in d:
        val = d[key]
        inverse.setdefault(val, []).append(key)
    return inverse

文档指出:

setdefault(key[, default]) If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

果然,当我在字典上测试它时 returns 如果它已经在列表中,它的值。 但是 .append() 是如何改变字典中的列表的呢?如果键在字典中,setdefault returns 它的值,在本例中是一个列表。 append 方法适用于列表,但它如何引用字典中的列表?

setdefault() 方法 returns 具有指定键的项目的值。例如:

x = { 'car': 'ford'}
y = x.setdefault('car', 'toyota')
z = x.setdefault('color', 'black')
print(y, z)
# ford black

由于在您的 dict 中设置的值是一个列表,这就是返回的内容,此时可以调用 append

您必须小心,如果原始值或新值不是列表,这可能会引发异常。例如:

x = { 'people': 10 }
x.setdefault('people', []).append('bob')
# AttributeError: 'int' object has no attribute 'append'