我有这样一个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'}
这真烦人。我无法知道我在哪里犯了错误。
我该如何解决这个恼人的问题?
答案 0 :(得分:3)
分配会创建对同一对象的新引用,而不是副本。如果您想更改字典但保留副本,请明确创建副本:
cpnxt = nxt.copy()
这会创建一个浅副本;一个新的字典,其中的键和值不加改变地复制。您可以更改新副本中的键,但如果您更改了值(例如,附加到列表或对nxt['jsondata']
嵌套词典进行了更改),您仍然会看到这些更改已共享。< / p>
在您的情况下,您只删除了键,并替换了另一个键的值,因此浅拷贝应该足够了。如果您需要深副本,其中值也以递归方式复制,请使用copy.deepcopy()
function。