在for循环中填充python字典会返回相同的值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在for循环中填充python字典会返回相同的值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2371字,纯文字阅读大概需要4分钟。
内容图文
为了项目的需要,我迭代一些数据并将所需的值添加到预制字典中.
这里是条带化的代码示例,代表我的问题:
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是在循环之外创建的,所以你只创建一个dict.如果你想要三个不同的dicts,你需要创建三个不同的dicts,所以在循环中移动dic的初始创建.
要回答您更新的问题,问题是尽管您认为每个parsed.append(dic)都附加了一个新的dict,但您只需要将相同的dict附加三次.附加不会复制字典.因此,无论何时修改该dict,解析中的所有dicts都会显示更改,因为它们都是相同的dict.此版本的第二个代码示例可能更具说明性:
>>> 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': ''}]
请注意,更改dict“有效”,因为它确实更改了值,但无论如何,列表仍然多次包含相同的dict,因此您所做的任何更改都会覆盖您之前所做的任何更改.最后,您的列表仅包含dict的最后一个版本,因为所有先前的更改都被覆盖在列表中的所有dicts中.
内容总结
以上是互联网集市为您收集整理的在for循环中填充python字典会返回相同的值全部内容,希望文章能够帮你解决在for循环中填充python字典会返回相同的值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。