如何在Python中初始化空列表的字典?

我试图以编程方式创build一个列表字典是不能让我个别地址字典键。 每当我创build列表字典并尝试附加到一个键,所有这些都被更新。 这是一个非常简单的testing用例:

data = {} data = data.fromkeys(range(2),[]) data[1].append('hello') print data 

实际结果: {0: ['hello'], 1: ['hello']}

预期结果: {0: [], 1: ['hello']}

这是有用的

 data = {0:[],1:[]} data[1].append('hello') print data 

实际和预期结果: {0: [], 1: ['hello']}

为什么fromkeys方法不能按预期工作?

[]作为第二个parameter passing给dict.fromkeys()会产生一个相当无用的结果 – 字典中的所有值将是同一个列表对象。

在Python 2.7或更高版本中,您可以使用dicitonary理解:

 data = {k: [] for k in range(2)} 

在早期版本的Python中,可以使用

 data = dict((k, []) for k in range(2)) 

改用defaultdict :

 from collections import defaultdict data = defaultdict(list) data[1].append('hello') 

这样你就不需要事先初始化你想用来列出的所有密钥。

你的例子中发生了什么是你使用一个 (可变)列表:

 alist = [1] data = dict.fromkeys(range(2), alist) alist.append(2) print data 

会输出{0: [1, 2], 1: [1, 2]}

您正在使用单个列表的引用来填充字典,因此当您更新字典时,更新会反映在所有引用中。 尝试字典理解,而不是。 请参阅使用Python中的列表理解创build词典

 d = {k : v for k in blah blah blah} 

你可以使用这个:

数据[:1] = ['hello']