2017-09-05 1 views
1

je dois ajouter le JSON de données dans une liste de données dans le plus grand JSON, mais je reçois une copie par des références, mais je besoin d'une copie par des valeurs, voici mon code:comment faire une copie par des valeurs pour un JSON?

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") 

Et mon résultat est:

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} 

Toute aide! Merci

Répondre

0

Python effectue des copies superficielles aux objets par défaut. Il y a une bibliothèque qui peut vous aider à appeler copy. La commande que vous allez avoir besoin d'invoquer est copy.deepcopy(myVar) qui fera une copie du contenu aka copie complète (comme vous l'aurez deviné)

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

+0

Python doesn «Ne faites pas de copies superficielles» lors de la cession, il n'en fait aucune copie, sauf demande expresse. –

0

J'ai trouvé une réponse:

avec la fonction : data.copy() qui copient les valeurs,

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()) 

si dataJS['data'].append(data.copy()) fonctionne très bien.

+0

Créer la dict 'data' directement dans la boucle serait encore plus simple ... –

2

Le problème est que vous créez un seul data dict avant la boucle, et continuer à écraser ses valeurs et l'ajouter à votre liste. Le point clé est ici le même dict qui est ajouté à votre liste - en Python, affectation ne crée jamais une nouvelle copie de votre objet (quel que soit le type). There's a very good article about this here et je vous suggère fortement de passer quelques minutes à le lire (et à l'expérimenter dans un shell python) afin de comprendre comment les "variables" de python diffèrent des plus courantes de style C.

Dans votre cas, la solution est évidente: créer une nouvelle data dict à chaque itération, à savoir:

dataJS = {'data': []} 
for d in res: 
    data = { 
     'ver': d[0], 
     'exp': '{"DT": "1344", "Vl": 757}' 
     } 
    dataJS["data"].append(data) 
0

Une solution très simple serait réduire la portée des data -

dataJS['data'] = [] 
for d in res: 
    data = {} 
    data['ver'] = d[0] 
    ... 
+0

La réponse de bruno fournit une explication détaillée. –