Python Dicnary est passé par référence à la liste lorsqu'il est déclaré de la portée, avec l'utilisation de retour: p> Comment puis-je passer en copiant de manière pythonique, sans le déclarer dans la boucle? Comment forcer une variable à ne pas être une référence d'objet, A.append (b) code>. Par exemple, le code suivant:
6 Réponses :
Vous avez un et un seul dict, et vous continuez à écraser sa clé ID code>, créez la dicte dans la boucle
my_list = [{'id' : str(i)} for i in range(3)]
concept strud>: liste stocke la référence à l'objet ( sortie: p> my_dict code>), donc chaque fois que vous modifiez quoi que ce soit à l'intérieur du
my_dict code> être reflété dans votre liste (
my_list code>) p>
Voici ma solution: une manière plus courte pourrait être: p>
Oui, les dictionnaires sont passés par référence; Tous les objets sont en python. Les latérales sont transmises par une valeur bien sûr.
Le code peut fonctionner comme prévu si vous appendez le dictionnaire directement dans la liste comme celle-ci: p> peut être amélioré comme @YUSEF Maali a suggéré: p>
Bonjour! Alors que ce code peut résoudre la question, , y compris une explication de la manière et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de la qualité. de votre message et aboutit probablement à plus de votes. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement la personne qui demande maintenant. S'il vous plaît Modifier Votre réponse Pour ajouter des explications et donner une indication de quelles limitations et hypothèses s'appliquent.
L'instance Vous devez créer Une nouvelle instance du dictionnaire pour chaque boucle: p> Ce code a de nombreuses possibilités d'optimisation: p> et la meilleure façon pythonique est la compréhension de la liste: p> my_dict code> est déclarée et attribuée à l'extérieur de la boucle pour la boucle, vous devez donc ajouter à
my_list code> la même instance du dictionnaire.
my_list = [{'id': str (i)} pour i in gamme (3)] code>. manquant
} code>
my_list = [] for i in range(0,3): my_dict = {} # making dictionary every time when running the loop. my_dict['id'] = str(i) # assigning value my_list.append(my_dict) #appending in list my_list
Créez la dict à l'intérieur de la boucle ou simplement annoncer un littéral dict.
Les mêmes réponses que sur cette question s'appliquent ici: Pourquoi est-ce que c'est Ce générateur Python renvoyant la même valeur à chaque fois?