python - 在 for 循环中填充 python 字典返回相同的值

标签 python python-2.7

为了项目的需要,迭代一些数据并将需要的值添加到预制字典。

这里是代表我的问题的精简代码示例:

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/

相关文章:

python - 正确使用 scipy.optimize.fmin_bfgs

python - 在 macOS High Sierra 上安装 mysql-python

python - 当没有数据像素时对图像应用滤镜

python - 查找后不读取所有字符

python - 对包裹的 2D 数组中的子数组进行高效 Numpy 采样

python - 将默认参数定义为全局变量

python - 为什么 unicode(u'') 传递错误参数引发 TypeError

python - 将 INSERT SQL 语句的无效值更改为 None 但出现 "Data Truncated"错误

python - 无法将长整数从嵌入式 Python 返回到 C++

python - 如何让 VS Code 读取 Python 导入而不显示黄色波浪线?