2017-04-22 2 views
1

Brève description du code:Fonction qui retourne le dictionnaire en écrasant tous les dictionnaires

Le code principal crée d'abord un dictionnaire vierge, qui est transmis à ma fonction. La fonction détermine le nombre de chaque nombre et met à jour le dictionnaire qui est ensuite renvoyé. Cependant, lorsque la fonction s'exécute, elle écrase l'entrée 'blank_dictionary' pour qu'elle soit identique au dictionnaire qu'elle renvoie ('new_dictionary'). Pourquoi cela arrive-t-il? Je veux que le "dictionnaire" dans le code principal reste vide tout au long afin qu'il puisse être réutilisé.

def index_list(lst, blank_dictionary): 
    new_dictionary = blank_dictionary 
    for i in lst: 
     new_dictionary[i] += 1 
    return new_dictionary 

number = 1 
maximum = 3 
numbers = range(1,maximum+1) 

dictionary = {} 
for i in numbers: 
    dictionary[i] = 0 

print ('original blank dictionary', dictionary) 
new_dictionary = index_list([3,3,3],dictionary) 
print ('new dictionary which indexed the list', new_dictionary) 
print ('should still be blank, but isnt', dictionary) 

Sorties:

original blank dictionary {1: 0, 2: 0, 3: 0} 
new dictionary which indexed the list {1: 0, 2: 0, 3: 3} 
should still be blank, but isnt {1: 0, 2: 0, 3: 3} 

Merci beaucoup

+2

Copie possible de [Comment copier un dictionnaire et modifier uniquement la copie] (http://stackoverflow.com/questions/2465921/how-to-copy-a-dictionary-and-only-edit-the-copy –

+1

Oui, merci @PierPaolo. – PurpleDiane

+0

[Lire sur la façon dont les variables et l'affectation fonctionnent en Python.] (Https://nedbatchelder.com/text/names.html) – user2357112

Répondre

3

Vous définissez new_dictionary à la référence -blank_dictionary. Changez la ligne à new_dictionary = dict(blank_dictionary) et tout ira bien. L'utilisation de la fonction dict() constructor fera un nouveau new_dictionary et donc blank_dictionary ne sera pas modifié. Vous pouvez rechercher le defaultdict dans le module collections. Si vous avez seulement besoin de compter le nombre de fois que chaque élément apparaît, pensez au collections.counter.

+0

Ah je vois, donc c'est comme un pointeur en C si dict() n'est pas utilisé ? Merci beaucoup, cela me rendait fou. – Nishalc

1

Jetez un oeil here

vous montre ce qui se passe dans votre code.

1

Ce comportement n'est pas limité aux dicts. En Python, chaque fois que vous passez un objet mutable à une fonction, la fonction opère sur l'objet original, pas sur une copie. Ce n'est pas le cas pour les objets immuables tels que les tuples et les chaînes.

Cependant, dans ce cas, il n'y a aucune raison de passer un dictionnaire vierge à la fonction en premier lieu. La fonction peut créer un nouveau dictionnaire et le retourner.