所有键都指向同一个列表

所有键都指向同一个列表

这让我有点悲伤.。

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

l = ['a','b','c']

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


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

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


开心每一天1111
浏览 317回答 3
3回答

尚方宝剑之说

你可以用一个词来理解:>>> keys = ['a','b','c']>>> value = [0, 0]>>> {key: list(value) for key in keys}     {'a': [0, 0], 'b': [0, 0], 'c': [0, 0]}

泛舟湖上清波郎朗

这个答案是为了向任何被试图实例化的结果搞砸的人解释这种行为。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对许多人来说,这不是他们的本意!现在,让我们尝试将列表的显式副本用作默认值。>>> 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']}但它们确实不同[]在本例中,这是预期的结果。

小怪兽爱吃肉

你可以用这个:l = ['a', 'b', 'c'] d = dict((k, [0, 0]) for k in l)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python