【问题标题】:why does appending to list in dictonary have different results? [duplicate]为什么附加到字典中的列表会产生不同的结果? [复制]
【发布时间】:2020-05-08 19:06:40
【问题描述】:

Python 3.7.6(默认,2020 年 1 月 8 日,20:23:39)[MSC v.1916 64 位 (AMD64)]

my_list = ["a","b","c"]

dict_one = {key:[] for key in my_list}
print(dict_one)
{'a': [], 'b': [], 'c': []}

dict_two = dict.fromkeys(my_list, [])
print(dict_two)
{'a': [], 'b': [], 'c': []}

dict_one['a'].append('some_data')
dict_two['a'].append('some_data')

print(dict_one)
{'a': ['some_data'], 'b': [], 'c': []}

print(dict_two)
{'a': ['some_data'], 'b': ['some_data'], 'c': ['some_data']}

我预计 dict_one 和 dict_two 的结果相同。 谁能解释一下区别?

【问题讨论】:

标签: python list dictionary append


【解决方案1】:

这是“Least Astonishment” and the Mutable Default Argument 的变体。

fromkeys 不会为它添加到正在构建的字典中的每个值创建一个新的空列表;它使用您提供的相同(可变)值作为第二个参数。


顺便说一句,如果有办法提供一个工厂来生产价值,那就太好了;那么你可以写

dict_three = dict.fromkeys(my_list, factory=lambda: [])

类似于defaultdict 如何使用函数来生成新键的初始值:

d = defaultdict(list)  # *not* d = defaultdict([])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多