dict.fromkeys都指向同一个列表

时间:2013-03-20 06:02:25

标签: python

这让我有点悲伤......

我从列表中创建了一个字典

l = ['a','b','c']
d = dict.fromkeys(l, [0,0]) # initializing dictionary with [0,0] as values

d['a'] is d['b'] # returns True

如何使字典的每个值成为单独的列表?这是否可能不迭代所有键并将它们设置为等于列表?我想修改一个列表而不改变所有其他列表。

4 个答案:

答案 0 :(得分:33)

你可以使用词典理解:

>>> keys = ['a','b','c']
>>> value = [0, 0]
>>> {key: list(value) for key in keys}
    {'a': [0, 0], 'b': [0, 0], 'c': [0, 0]}

答案 1 :(得分:16)

这个答案是为了向任何人试图用dict实例化fromkeys() dict并使用#Python 3.4.3 (default, Nov 17 2016, 01:08:31) # start by validating that different variables pointing to an # empty mutable are indeed different references. >>> l1 = [] >>> l2 = [] >>> id(l1) 140150323815176 >>> id(l2) 140150324024968 中的可变默认值来解释这种行为。

考虑:

l1

因此对l2的任何更改都不会影响dict,反之亦然。 到目前为止,任何可变的都是如此,包括# create a new dict from an iterable of keys >>> dict1 = dict.fromkeys(['a', 'b', 'c'], []) >>> dict1 {'c': [], 'b': [], 'a': []}

# the dict has its own id.
>>> id(dict1)
140150327601160

# but look at the ids of the values.
>>> id(dict1['a'])
140150323816328
>>> id(dict1['b'])
140150323816328
>>> id(dict1['c'])
140150323816328

这可以是一个方便的功能。 在这里,我们为每个键分配一个默认值,该值也恰好是一个空列表。

>>> dict1['a'].append('apples')
>>> dict1
{'c': ['apples'], 'b': ['apples'], 'a': ['apples']}
>>> id(dict1['a'])
>>> 140150323816328
>>> id(dict1['b'])
140150323816328
>>> id(dict1['c'])
140150323816328

确实他们都使用相同的参考! 改为1是对所有人的改变,因为它们实际上是同一个对象!

>>> empty_list = []
>>> id(empty_list)
140150324169864

对很多人来说,这不是预期的!

现在让我们尝试将列表的显式副本用作默认值。

empty_list

现在创建一个带有>>> dict2 = dict.fromkeys(['a', 'b', 'c'], empty_list[:]) >>> id(dict2) 140150323831432 >>> id(dict2['a']) 140150327184328 >>> id(dict2['b']) 140150327184328 >>> id(dict2['c']) 140150327184328 >>> dict2['a'].append('apples') >>> dict2 {'c': ['apples'], 'b': ['apples'], 'a': ['apples']} 副本的字典。

>>> not_empty_list = [0]
>>> dict3 = dict.fromkeys(['a', 'b', 'c'], not_empty_list[:])
>>> dict3
{'c': [0], 'b': [0], 'a': [0]}
>>> dict3['a'].append('apples')
>>> dict3
{'c': [0, 'apples'], 'b': [0, 'apples'], 'a': [0, 'apples']}

仍然没有快乐! 我听到有人喊,这是因为我用了一个空列表!

fromkeys()

None的默认行为是将>>> dict4 = dict.fromkeys(['a', 'b', 'c']) >>> dict4 {'c': None, 'b': None, 'a': None} >>> id(dict4['a']) 9901984 >>> id(dict4['b']) 9901984 >>> id(dict4['c']) 9901984 分配给值。

None

实际上,所有的值都是相同的(也是唯一的!)dict。 现在,让我们以无数种方式之一通过>>> for k, _ in dict4.items(): ... dict4[k] = [] >>> dict4 {'c': [], 'b': [], 'a': []} 进行迭代并更改值。

>>> id(dict4['a'])
140150318876488
>>> id(dict4['b'])
140150324122824
>>> id(dict4['c'])
140150294277576
>>> dict4['a'].append('apples')
>>> dict4
>>> {'c': [], 'b': [], 'a': ['apples']}

嗯。看起来和以前一样!

[]

但它们确实是不同的#!/bin/bash path=$1 find $path -type f s,在这种情况下是预期的结果。

答案 2 :(得分:7)

您可以使用:

l = ['a', 'b', 'c']
d = dict((k, [0, 0]) for k in l)

答案 3 :(得分:2)

l = ['a','b','c']
d = dict((i, [0, 0]) for i in l)