python中更新json字典的奇怪输出

2024-09-29 19:31:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一本json字典:

nxt = {"name": names[a], "profile_id": indata["profile_id"], "firstname": firstnames[a], "middlename": middlenames[a], "lastname": lastnames[a],
       "e_mail": e_mails[a], "phone_number": phone_numbers[a], "location": locations[a], "sex": genders[a],
       "user_id": indata["user_id"], "updated_by": indata["username"]}

我想更新字典:

cpnxt = nxt
del cpnxt['profile_id'], cpnxt['user_id'], cpnxt['updated_by']
nxt.update({"jsondata": cpnxt})
data.append(nxt)

我希望得到这样的结果:

nxt = {'e_mail': '', 'firstname': 'John', 'jsondata': "{'phone_number': '', 'firstname': 'John', 'middl...ame': 'John Smith', 'e_mail': '', 'location': ''}", 'lastname': 'Smith', 'location': '', 'middlename': '', 'name': 'John Smith', 'phone_number': '', 'sex': 'M'}

但我得到了这样一个结果:

nxt = {'e_mail': '', 'firstname': 'John', 'jsondata': {'e_mail': '', 'firstname': 'John', 'jsondata': {'e_mail': '', 'firstname': 'John', 'jsondata': {'e_mail': '', 'firstname': 'John', 'jsondata': {'e_mail': '', 'firstname': 'John', 'jsondata': {'e_mail': '', 'firstname': 'John', 'jsondata': {...}, 'lastname': 'Smith', 'location': '', 'middlename': '', 'name': 'John Smith', 'phone_number': '', 'sex': 'M'}, 'lastname': 'Smith', 'location': '', 'middlename': '', 'name': 'John Smith', 'phone_number': '', 'sex': 'M'}, 'lastname': 'Smith', 'location': '', 'middlename': '', 'name': 'John Smith', 'phone_number': '', 'sex': 'M'}, 'lastname': 'Smith', 'location': '', 'middlename': '', 'name': 'John Smith', 'phone_number': '', 'sex': 'M'}, 'lastname': 'Smith', 'location': '', 'middlename': '', 'name': 'John Smith', 'phone_number': '', 'sex': 'M'}, 'lastname': 'Smith', 'location': '', 'middlename': '', 'name': 'John Smith', 'phone_number': '', 'sex': 'M'}

这真的很烦人。我不知道我在哪里犯了错

我该如何解决这个恼人的问题


Tags: nameidnumberphonemaillocationfirstnamejohn
1条回答
网友
1楼 · 发布于 2024-09-29 19:31:15

赋值将创建对同一对象的新引用,而不是副本。如果要更改词典但保留副本,请显式创建副本:

cpnxt = nxt.copy()

这将创建一个副本;一个新的字典,把键和值原封不动地复制过来。您可以更改新副本中的键,但是如果您更改了值(例如,附加到列表,或者对nxt['jsondata']嵌套字典进行了更改),您仍然可以看到这些更改是共享的

在您的例子中,您只删除了键,并替换了另一个键的值,因此浅拷贝就足够了。如果需要deep副本,其中值也是递归复制的,请使用^{} function

相关问题 更多 >

    热门问题