为了项目的需要,迭代一些数据并将需要的值添加到预制字典。
这里是代表我的问题的精简代码示例:
class Parser:
def __init__(self):
self.records = [['value1','value2','value3'],
['value4','value5','value6'],
['value7','value8','value9']]
def get_parsed(self):
parsed = []
dic = {'key1': '',
'key2': '',
'key3': '',
}
for i in self.records:
dic['key1'] = i[0]
dic['key2'] = i[1]
dic['key3'] = i[2]
parsed.append(dic)
return parsed
我希望得到的是这样的字典列表:
[{'key1':'value1','key2':'value2','key3':'value3'},
{'key1':'value4','key2':'value5','key3':'value6'},
{'key1':'value7','key2':'value8','key3':'value9'}]
但是我得到的是:
[{'key1':'value1','key2':'value2','key3':'value3'},
{'key1':'value1','key2':'value2','key3':'value3'},
{'key1':'value1','key2':'value2','key3':'value3'}]
虽然如果我将字典初始化移动到“for”循环中——我得到了想要的结果,但我不明白为什么会这样?
编辑: 问题更多的是“为什么会这样” 我在 ipython 中做了一些测试,这就是我得到的:
In [1]: d = {'a':'','b':'','c':''}
In [2]: d
Out[2]: {'a': '', 'b': '', 'c': ''}
In [3]: d['a'] = 'value'
In [4]: d['b'] = 'other_value'
In [5]: d['c'] = 'third_value'
In [6]: d
Out[6]: {'a': 'value', 'b': 'other_value', 'c': 'third_value'}
In [7]: d['a'] = 'inserting new value'
In [8]: d
Out[8]: {'a': 'inserting new value', 'b': 'other_value', 'c': 'third_value'}
所以键的值可以被更新并且它改变,为什么它不发生在 FOR 循环中呢?
最佳答案
因为您的 dic
是在循环外创建的,所以您只创建了一个字典。如果你想要三个不同的字典,你需要创建三个不同的字典,所以将 dic
的初始创建移动到循环中。
要回答您更新后的问题,问题是尽管您认为您正在为每个 parsed.append(dic)
附加一个新的字典,但您只是将同一个字典附加了三次。 Append
不会复制字典。因此,无论何时修改该字典,parse
中的所有字典都会显示更改,因为它们都是相同的字典。您的第二个代码示例的这个版本可能更具说明性:
>>> d = {'a': '', 'b': '', 'c': ''}
>>> stuff = []
>>> stuff.append(d)
>>> print stuff
[{'a': '', 'c': '', 'b': ''}]
>>> d['a'] = 'other'
>>> print stuff
[{'a': 'other', 'c': '', 'b': ''}]
>>> stuff.append(d)
>>> print stuff
[{'a': 'other', 'c': '', 'b': ''}, {'a': 'other', 'c': '', 'b': ''}]
>>> d['a'] = 'yet another'
>>> print stuff
[{'a': 'yet another', 'c': '', 'b': ''}, {'a': 'yet another', 'c': '', 'b': ''}]
请注意,更改字典“有效”,因为它确实更改了值,但无论如何,列表仍多次包含相同的字典,因此您所做的任何更改都会覆盖您之前所做的任何更改。最后,您的列表只包含最新版本的字典,因为列表中所有字典中的所有早期更改都被覆盖了。
关于python - 在 for 循环中填充 python 字典返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753099/