Python3追加键值对改变先前的条目

Python3追加键值对改变先前的条目,python,list,append,Python,List,Append,我正在尝试构建以下JSON: {'Keys-1': [{'Key1': 'Value1'}, {'Key1': 'Value2'}]} 下面是我用来构建这个JSON的代码: existingFile = {} importobjs = [] importobj = {} objkey = 'Key1' objvalue = 'Value1' importobj[objkey] = objvalue importobjs.append(importobj) objvalue = 'Value2'

我正在尝试构建以下JSON:

{'Keys-1': [{'Key1': 'Value1'}, {'Key1': 'Value2'}]}
下面是我用来构建这个JSON的代码:

existingFile = {}
importobjs = []
importobj = {}
objkey = 'Key1'
objvalue = 'Value1'
importobj[objkey] = objvalue
importobjs.append(importobj)
objvalue = 'Value2'
importobj[objkey] = objvalue
importobjs.append(importobj)
existingFile['Keys-1'] = importobjs
除了第一个键值对的值被更新为“Value2”之外,工作几乎完美

{'Keys-1': [{'Key1': 'Value2'}, {'Key1': 'Value2'}]}

代码的问题(如注释中所述)在于对象是通过引用而不是通过值传递的。您的
现有文件的实际外观是

{'Keys-1': [object@importobj_address, object@importobj_address]}
因此,数组包含两个完全相同的对象。如果再次更改
importobj
,并将其添加到
importobj
,则阵列中将有3个完全相同的对象

下面是一个如何正确实现此功能的示例:

existingFile = {}
importobjs = []
first_key = 'Key1'
importobjs.append({first_key:'Value1'})
importobjs.append({first_key:'Value2'})
existingFile['Keys-1'] = importobjs
要扩展示例,请执行以下操作:

existingFile = {}
first_objs = []
first_key = 'Key1'
first_objs.append({first_key:'Value1'})
first_objs.append({first_key:'Value2'})
existingFile['Keys-1'] = first_objs
second_objs = []
second_key = 'Key2'
second_objs.append({second_key:'Value3'})
second_objs.append({second_key:'Value4'})
existingFile['Keys-2'] = second_objs

但是,通过循环列表而不是每个字符串的变量,可以避免这些问题

代码的问题(如注释中所述)是对象是通过引用而不是通过值传递的。您的
现有文件的实际外观是

{'Keys-1': [object@importobj_address, object@importobj_address]}
因此,数组包含两个完全相同的对象。如果再次更改
importobj
,并将其添加到
importobj
,则阵列中将有3个完全相同的对象

下面是一个如何正确实现此功能的示例:

existingFile = {}
importobjs = []
first_key = 'Key1'
importobjs.append({first_key:'Value1'})
importobjs.append({first_key:'Value2'})
existingFile['Keys-1'] = importobjs
要扩展示例,请执行以下操作:

existingFile = {}
first_objs = []
first_key = 'Key1'
first_objs.append({first_key:'Value1'})
first_objs.append({first_key:'Value2'})
existingFile['Keys-1'] = first_objs
second_objs = []
second_key = 'Key2'
second_objs.append({second_key:'Value3'})
second_objs.append({second_key:'Value4'})
existingFile['Keys-2'] = second_objs

但是,通过循环列表而不是每个字符串的变量,可以避免这些问题

将同一对象添加到列表中两次…append方法使用对象的引用,如果再次更改对象importobj,然后将其追加,您将看到相同值对的3倍。这是“按引用传递vs按值传递”的结果如果你需要更好的谷歌搜索词。那么你将同一个对象添加两次到列表中…append方法使用对象的引用,如果你再次更改对象importobj,然后追加它,你将看到相同值对的3倍。这是“按引用传递vs按值传递”的结果如果你需要更好的谷歌搜索词,谢谢你,海莉·吉尔卢,谢谢你,海莉·吉尔卢,我在真正的代码中确实有两个循环,我只是把它分解一下,这样我就可以很容易地理解发生了什么。这里对我来说唯一的区别似乎是,如果变量importobj等于值{'Key1':'Value2'},并且我执行importobjs.append(importobj)命令,那么将覆盖第一对。但是您的方法将键值对添加为{key:'value'},而不是添加为包含值“{'key1':'value'}”的字符串。你的方法很有效!再次感谢你!谢谢Hayley Guillou,谢谢Hayley Guillou,我在真正的代码中确实有两个循环,我只是把它分解一下,这样我就可以很容易地理解发生了什么。这里对我来说唯一的区别似乎是,如果变量importobj等于值{'Key1':'Value2'},并且我执行importobjs.append(importobj)命令,那么将覆盖第一对。但是您的方法将键值对添加为{key:'value'},而不是添加为包含值“{'key1':'value'}”的字符串。你的方法很有效!再次感谢你!