11
votes

Valeur par défaut dans une fonction de Python

Je remarque ce qui suit:

class c:
  def __init__(self, data=[]):
    self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]


2 commentaires

Veuillez lire la documentation de balisage pour voir comment formater correctement le code. C'est sur le côté droit de la page. Veuillez mettre à jour votre question pour indenter les espaces de code 4.


Connexes: , Stackoverflow.com/questions/1534407/... , Stackoverflow.com/questions/1651154/...


3 Réponses :


11
votes

Oui, c'est un comportement correct.

Cependant, de votre question, il semble que ce ne soit pas ce que vous attendiez. P>

Si vous voulez correspondre à vos attentes, soyez conscient des éléments suivants:

règle 1. N'utilisez pas d'objets mutables comme des valeurs par défaut. p> xxx pré>

ne créera pas d'objet de liste. L'objet de liste par défaut pour arg code> sera partagé partout. P>

De même P>

class MyClass( object ):
    def __init__( self, arg= None ):
        self.myList= [] if arg is None else arg 


5 commentaires

ne fonctionnera jamais. est un peu dur. ne vous donnera pas un nouvel objet mutable vide sur chaque appel semble un peu plus équilibré. Si vous savez que cela se produit, vous pouvez réellement utiliser ce comportement.


@Matth: Réutiliser le même objet mutable via une valeur par défaut est si étrange qu'il défie la recherche d'un cas d'utilisation raisonnable. C'est une valeur par défaut , de sorte qu'elle peut (ou peut ne pas) être utilisée comme telle en fonction de l'utilisation de l'interface du client. Il serait si difficile de diagnostiquer des problèmes avec cela que je me tiens à ma formulation originale. Surtout pour N00BZ.


Vous devriez ajouter un exemple de comment travailler autour de cela. Sinon, la réponse est bonne et correcte.


Il y a un cas d'utilisation raisonnable pour presque tout. Pour les valeurs par défaut mutable, je choisirais une stratégie de mémoisation simple, par exemple comme décrit ici par Alex Martelli ici: Stackoverflow.com/questions/1651154/...


@Scott Griffiths: Bien qu'il y ait un cas d'utilisation, je débattre "sensible". Oui, cela fonctionne, mais le code des spaghettis illisible. Utiliser des objets mutables comme par défaut est une mauvaise idée. Dans l'exemple question, la syntaxe de valeur par défaut est utilisée pour fournir un contexte de mémoisation caché; Il ne correspond pas aux modèles de conception habituels pour "défaut" car il existe une raison sensible de fournir une valeur réelle.



4
votes

C'est un piège classique. Voir http://zephyrfalcon.org/labs/python_pitfalls.html , section 5: "Mautable Arguments par défaut "


0 commentaires

1
votes

Faites toujours des fonctions comme celle-ci alors: xxx

Vous pouvez également utiliser data = données ou [] , mais qui empêche l'utilisateur de passer Vider les paramètres ( '' ', 0 , false etc.).


3 commentaires

Bien sûr, vous pouvez également faire si pas les données: données = [] .


Votre exemple data = Data ou [] fonctionne parfaitement pour les listes vides passées. Vous dire que vous dites data sera [] ou [] de sorte qu'il examinera le premier et qu'il voit qu'il évaluera "False", alors il prendra la autre valeur.


Je sais que mon point était que lorsque vous passez false par exemple, [] sera utilisé comme valeur, bien que vous avez passé false .