为了账号安全,请及时绑定邮箱和手机立即绑定

所有键都指向同一个列表

所有键都指向同一个列表

叮当猫咪 2019-11-06 09:05:43
所有键都指向同一个列表这让我有点悲伤.。我从一个列表中创建了一本字典l = ['a','b','c']d = dict.fromkeys(l, [0,0]) # initializing dictionary with [0,0] as valuesd['a'] is d['b'] # returns True如何使字典的每个值成为单独的列表?如果不对所有键进行迭代并将它们设置为等于一个列表,这是可能的吗?我想修改一个列表而不更改其他列表。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

你可以用一个词来理解:

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


查看完整回答
反对 回复 2019-11-07
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

这个答案是为了向任何被试图实例化的结果搞砸的人解释这种行为。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']}

但它们确实不同[]在本例中,这是预期的结果。



查看完整回答
反对 回复 2019-11-07
?
湖上湖

TA贡献2003条经验 获得超2个赞

你可以用这个:

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


查看完整回答
反对 回复 2019-11-07
  • 3 回答
  • 0 关注
  • 307 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信