这让我有点悲伤......
我从列表中创建了一个字典
l = ['a','b','c']
d = dict.fromkeys(l, [0,0]) # initializing dictionary with [0,0] as values
d['a'] is d['b'] # returns True
Run Code Online (Sandbox Code Playgroud)
如何使字典的每个值成为单独的列表?这是否可能不迭代所有键并将它们设置为等于列表?我想修改一个列表而不更改所有其他列表.
Ble*_*der 36
你可以使用词典理解:
>>> keys = ['a','b','c']
>>> value = [0, 0]
>>> {key: list(value) for key in keys}
{'a': [0, 0], 'b': [0, 0], 'c': [0, 0]}
Run Code Online (Sandbox Code Playgroud)
Sha*_*han 21
这个答案是为了向任何人解释这种行为,他们试图用一个可变的默认值来实例化一个dictwith .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
Run Code Online (Sandbox Code Playgroud)
所以任何改变l1都不会影响l2,反之亦然.到目前为止,任何可变的都是如此,包括a dict.
# create a new dict from an iterable of keys
>>> dict1 = dict.fromkeys(['a', 'b', 'c'], [])
>>> dict1
{'c': [], 'b': [], 'a': []}
Run Code Online (Sandbox Code Playgroud)
这可以是一个方便的功能.在这里,我们为每个键分配一个默认值,该值也恰好是一个空列表.
# 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
Run Code Online (Sandbox Code Playgroud)
确实他们都使用相同的参考!改为1是对所有人的改变,因为它们实际上是同一个对象!
>>> dict1['a'].append('apples')
>>> dict1
{'c': ['apples'], 'b': ['apples'], 'a': ['apples']}
>>> id(dict1['a'])
>>> 140150323816328
>>> id(dict1['b'])
140150323816328
>>> id(dict1['c'])
140150323816328
Run Code Online (Sandbox Code Playgroud)
对许多人来说,这不是预期的!
现在让我们尝试将列表的显式副本用作默认值.
>>> empty_list = []
>>> id(empty_list)
140150324169864
Run Code Online (Sandbox Code Playgroud)
现在创建一个带有副本的字典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']}
Run Code Online (Sandbox Code Playgroud)
仍然没有快乐!我听到有人喊,这是因为我用了一个空列表!
>>> 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']}
Run Code Online (Sandbox Code Playgroud)
默认行为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
Run Code Online (Sandbox Code Playgroud)
实际上,所有的值都是相同的(也是唯一的!)None.现在,让我们以无数种方式之一迭代dict并改变价值.
>>> for k, _ in dict4.items():
... dict4[k] = []
>>> dict4
{'c': [], 'b': [], 'a': []}
Run Code Online (Sandbox Code Playgroud)
嗯.看起来和以前一样!
>>> id(dict4['a'])
140150318876488
>>> id(dict4['b'])
140150324122824
>>> id(dict4['c'])
140150294277576
>>> dict4['a'].append('apples')
>>> dict4
>>> {'c': [], 'b': [], 'a': ['apples']}
Run Code Online (Sandbox Code Playgroud)
但它们确实是不同[]的,在这种情况下是预期的结果.
你可以用这个:
l = ['a', 'b', 'c']
d = dict((k, [0, 0]) for k in l)
Run Code Online (Sandbox Code Playgroud)