附加到一个python字典键由于某种原因附加到所有

时间:2015-12-01 00:01:02

标签: python dictionary

这是我的python代码(我使用的是Python 2.7.6):

row_of_words = ['word 1', 'word 2']
hw = ['h1', 'h2']
TD = {}

TD = TD.fromkeys(hw, [])
# TD is now {'h1': [], 'h2': []}

for index in range(len(row_of_words)):
    # This loops twice and in the first loop, index = 0 and in the second
    # loop, index = 1

    # Append 1 to the value of 'h1' (which is a list [])
    # The value for 'h1' should now be [1].

    # This loops twice to append 1 twice to the value of 'h1'.
    TD['h1'].append(1)

>>>TD
{'h2': [1, 1], 'h1': [1, 1]}

正如您在上面的两行中所看到的,当我打印TD时,它显示1h1都附加了h2。知道为什么它被附加到两者,即使我提到只将它附加到TD['h1']?如何制作它只会附加到' h1'?的值我评论了我的步骤,显示了我认为它的工作原理。

4 个答案:

答案 0 :(得分:4)

继续我的评论,你可以使用词典理解:

TD = {key:[] for key in hw}

会为hw中的每个项目创建一个空列表。例如:

>>> hw = ['h1','h2']
>>> TD = {key:[] for key in hw}
>>> TD
{'h1': [], 'h2': []}
>>> TD['h1'].append(1)
>>> TD
{'h1': [1], 'h2': []}

回答你原来的问题:

更改一个列表会更改每个列表的原因是因为dict.fromkey(seq,[value])是一个创建新词典的函数,seq中的每个项都将映射到可选参数value。您将一个空列表作为value传入,这意味着您将每个键设置为指向对同一列表的引用。由于所有键都指向同一个列表,因此显然通过访问任何键来更改列表(尝试访问h2并且您将看到这是真的)将反映所有键的更改。

答案 1 :(得分:1)

你可以这样做:

TD = dict((i, [],) for i in hw)

答案 2 :(得分:1)

魔法发生在TD = TD.fromkeys(hw, [])

它创建一个列表,并将一个列表指定为两个键的值。因此,当您更改任一键时,您将更改单个内部列表,从而更改两个键所指向的内容。

为了说明这一点,请查看:

row_of_words = ['word 1', 'word 2']
hw = ['h1', 'h2']
TD = {}
A = []

TD = TD.fromkeys(hw, A)

for index in range(len(row_of_words)):
    TD['h1'].append(1)
    print index, TD

print TD  # {'h2': [1, 1], 'h1': [1, 1]}
A.append(2)
print TD  # {'h2': [1, 1, 2], 'h1': [1, 1, 2]}

答案 3 :(得分:0)

答案适用于 Python 3 和 Python 2。只是想用此处提供的方法提供两个可比较的示例。

问题

d = dict.fromkeys([1,2,3],[]) # list to empty dict, method 1
d[1].append("foo") # assumingly append item to key 1 only
d
# {1: ['foo'], 2: ['foo'], 3: ['foo']} # appends to all keys instead

解决方案

d = {key:[] for key in [1,2,3]} # list to empty dict, method 2
d[1].append("foo") # really only append item to key 1
d
# {1: ['foo'], 2: [], 3: []} # works