这是我的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
时,它显示1
和h1
都附加了h2
。知道为什么它被附加到两者,即使我提到只将它附加到TD['h1']
?如何制作它只会附加到' h1'?的值我评论了我的步骤,显示了我认为它的工作原理。
答案 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