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

如何在Python中初始化空列表字典?,python,list,dictionary,Python,List,Dictionary,我试图以编程方式创建列表字典,但无法单独寻址字典键。每当我创建列表字典并尝试附加到一个键时,所有列表都会更新。下面是一个非常简单的测试用例: 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('

我试图以编程方式创建列表字典,但无法单独寻址字典键。每当我创建列表字典并尝试附加到一个键时,所有列表都会更新。下面是一个非常简单的测试用例:

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的
方法不能按预期工作?

请改用:

这样,您就不必预先初始化要用于列表的所有键

在您的示例中,您使用了一个(可变)列表:


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

您正在使用对单个列表的引用填充词典,因此当您更新它时,更新会反映在所有引用中。试试字典理解。看见


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

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

data = {k: [] for k in range(2)}
在Python的早期版本中,可以使用

data = dict((k, []) for k in range(2))
你可以用这个:

data[:1] = ['hello']

在我的例子中,我需要预先初始化所有键,以便程序逻辑的其余部分可以按预期工作,但如果不是这样,这将是一个很好的解决方案。谢谢。我想这个答案缺少的是,这个解决方案是有效的,而不是OP的解决方案,因为这里的
list
不是一个空列表,而是一个类型(或者你可以把它看作是一个可调用的构造函数,我想)。因此,每次传递缺少的键时,都会创建一个新列表,而不是重复使用同一个。这是一种非常不直观的行为,您知道为什么所有键都使用同一个对象吗?@Bar,因为在Python语言的语义中,函数无法做任何其他事情。传入一个对象以用作所有关键帧的值,以便单个对象用于所有关键帧。
fromkeys()
方法最好接受一个工厂函数,这样我们就可以将
list
作为一个函数传入,并且该函数将为创建的每个键调用一次,但这不是
dict.fromkeys()
的实际API。这一点都不直观。我花了一个小时才找到。谢谢,如果您将dict()作为第二个参数传递,就会发生这种情况。非常令人费解的行为。@Orly这是因为首先创建了一个空字典,然后将对它的引用传递给所有初始化。关于初始化字典值的好建议。。。谢谢你,科比!我扩展了您的示例,以重置现有字典d中的值。我这样做了:d={k:0表示d中的k}这个答案中的
v
是什么?解释一下为什么这样做可能会有帮助。最初的问题贴在aks上,为什么它不能按预期工作。@william.taylor.09很明显,为什么它能工作,不是吗?OP问“为什么fromkeys方法不能按预期工作?”
data = {k: [] for k in range(2)}
data = dict((k, []) for k in range(2))
data[:1] = ['hello']