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]
3 Réponses :
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> ne créera pas d'objet de liste. L'objet de liste par défaut pour De même P> arg code> sera partagé partout. P>
class MyClass( object ):
def __init__( self, arg= None ):
self.myList= [] if arg is None else arg
ne fonctionnera jamais. code> est un peu dur.
ne vous donnera pas un nouvel objet mutable vide sur chaque appel code> 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 i>, 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 i> 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.
C'est un piège classique. Voir http://zephyrfalcon.org/labs/python_pitfalls.html , section 5: "Mautable Arguments par défaut " P>
Faites toujours des fonctions comme celle-ci alors: Vous pouvez également utiliser data = données ou [] code>, mais qui empêche l'utilisateur de passer Vider les paramètres em> (
'' ' code>,
0 code>,
false code> etc.). p> p> p>
Bien sûr, vous pouvez également faire si pas les données: données = [] code>.
Votre exemple data = Data ou [] code> fonctionne parfaitement pour les listes vides passées. Vous dire que vous dites
data code> sera
[] ou [] code> 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 code> par exemple,
[] code> sera utilisé comme valeur, bien que vous avez passé
false code>.
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/...