2015-08-23 1 views
1

J'ai du mal à comprendre ce qui se passe dans mon code. Donc, si j'ai la ligne suivante:Comprendre setdefault en Python

d = {} 
d.setdefault("key",[]).append("item") 

Cette retourne

{'key': ['item']} 

Alors je reçois ce setdefault fait. Il vérifie "key" dans le d, un dictionnaire, et s'il n'existe pas, il le crée sinon s'il existe, il renvoie la valeur. Cela renvoie une copie qui peut être manipulée et sera mise à jour dans le dictionnaire original. C'est une nouvelle idée pour moi. Cela signifie-t-il que setdefault renvoie une copie profonde, par opposition à une copie superficielle? J'essaie d'envelopper ma tête autour de cette copie superficielle par rapport à une copie profonde.

+3

"Ceci renvoie une copie qui peut être manipulée ..." - Êtes-vous sûr qu'il s'agit d'une "copie"? Si vous modifiez cette "copie", le "d" original ne change-t-il pas? – alfasin

+0

Si elle renvoyait une copie, la modification de celle-ci * ne * mettrait pas à jour le dictionnaire d'origine. – BrenBarn

Répondre

1

du Saint docs:

setdefault (touche [, par défaut])

Si la clé est dans le dictionnaire, retourner sa valeur . Sinon, insérez la clé avec la valeur par défaut et renvoyez la valeur par défaut. Par défaut, est défini sur Aucune.

2

il est equivelent à

item = d.get(key,default) 
d[key] = item 
d[key].action #in this case append 
2

opération Pas Python ne copie implicite. Déjà. La copie implicite est mauvaise, en ce qui concerne Python.

Ce sont des littéraux qui créent des objets. Chaque fois que setdefault est appelé, il évalue ses deux arguments. Lorsqu'il évalue son deuxième argument ([]), une nouvelle liste est créée. C'est complètement le même que a = [].

Si vous écrivez el = [], puis essayez .setdefault en el dans certains dict plus d'une fois, vous verrez qu'aucune copie n'est faite.

1

Le comportement est facilement explicable une fois que vous laissez tomber l'idée qu'il s'agit d'une copie. Ce n'est pas; c'est l'objet réel.