首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过值为JSON制作副本?

如何通过值为JSON制作副本?
EN

Stack Overflow用户
提问于 2017-09-05 18:15:55
回答 4查看 2.1K关注 0票数 1

我需要将数据JSON附加到更大的JSON中的数据列表中,但我通过引用获得一个副本,但我需要一个按值复制,以下是我的代码:

代码语言:javascript
复制
dataJS = {}
dataJS['data'] = []
data = {}
for d in res:
    data['ver'] = d[0]
    data['exp'] = "{\"DT\": \"1344\", \"Vl\": 757}"

    print("data : ", data )

    dataJS['data'].append(data)

print("\n\n")
for i in dataJS['data']:
    print("JsData : ", i)
print("\n\n")

我的结果是:

代码语言:javascript
复制
data :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 1}
data :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 5}
data :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 6}
data :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 9}
data :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}



JsData :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData :  {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}

有什么帮助吗!谢谢

EN

回答 4

Stack Overflow用户

发布于 2017-09-05 18:40:40

问题是,您在循环之前创建了一个data字典,并不断覆盖它的值并将其附加到列表中。这里的关键点是,它是附加到列表中的同一个-在Python语言中,赋值永远不会创建对象的新副本dict (无论它是什么类型)。There's a very good article about this here和我强烈建议您花几分钟时间阅读它(并在python shell中进行实验),这样您就可以理解python的“变量”与最常见的C风格的变量有何不同。

在您的例子中,解决方案是显而易见的:在每次迭代中创建一个新的data字典,即:

代码语言:javascript
复制
dataJS = {'data': []}
for d in res:
    data = {
        'ver': d[0], 
        'exp': '{"DT": "1344", "Vl": 757}'
        }
    dataJS["data"].append(data)
票数 2
EN

Stack Overflow用户

发布于 2017-09-05 18:20:19

我找到了答案:

使用复制值的函数:data.copy()

代码语言:javascript
复制
dataJS[pat] = {}
dataJS[pat]['version'] = newVersion
dataJS[pat]['data'] = []

data = {}
for i, d in enumerate(res) :
    data['type'] = d[2]
    data['exp'] = d[3]
    data['val'] = d[4]
    print("\n\n")
    print("d[4]",d[4])
    print("\n\n")
    dataJS[pat]['data'].append(data.copy())

所以dataJS['data'].append(data.copy())运行得很好。

票数 1
EN

Stack Overflow用户

发布于 2017-09-05 18:18:36

默认情况下,Python会对对象进行浅层复制。有一个叫做copy的库可以帮助你。您需要调用的命令是copy.deepcopy(myVar),它将创建内容的副本,也就是deep copy (如您所料)

https://docs.python.org/2/library/copy.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46052489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档