2016-01-12 26 views
1

更新JSON字典奇怪的輸出中我有這樣一個JSON字典:關於Python

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'} 

這真的很煩人。我不知道我犯了什麼錯誤。

我該如何解決這個煩人的問題?

+2

我沒有讀你的整個代碼,但只是你知道,'cpnxt = nxt'不會創建'nxt'的深層副本。你對'cpnxt'所做的任何修改都會發生在'nxt'上。如果您想製作不是參考副本的字典副本,請使用'dict.copy'方法或'deepcopy'模塊。 – Kevin

回答

3

賦值創建了對同一對象的新引用,而不是副本。如果你想改變一個字典,但保留一個副本,明確創建一個副本:

cpnxt = nxt.copy() 

這將創建一個複印件;一個新的字典,鍵和值在不變的情況下複製。您可以更改新副本中的密鑰,但如果更改了值(例如,追加到列表或對nxt['jsondata']嵌套字典進行了更改),您仍然會看到這些更改共享。

在你的情況下,你只能刪除鍵,並替換另一個鍵的值,所以淺拷貝就足夠了。如果您需要一個深的副本,其中值也遞歸地複製,使用copy.deepcopy() function