J'ai une situation dans laquelle la valeur de l'argument par défaut dans une tête de fonction est affectée par une clause if-clause dans l'organisme de fonction. J'utilise Python 3.7.3.
Nous avons deux fonctions Nous appelons la première fonction trois fois: p> la liste vide maintenant, nous appelons la troisième fonction ( Selon la sortie, ma question est liée à: p> Mais les réponses à cette question et la réponse du didacticiel uniquement, ce que je sais déjà. p> p> f code> et j code>. Je comprends le comportement des deux premières fonctions. Je ne comprends pas le comportement de la deuxième fonction. P> comportement de fonction que je comprends h1>
[] code> est initialisé sur le premier appel de la fonction. Lorsque nous appendons 5 code> à l code> alors l'instance de la liste dans la mémoire est modifiée. Par conséquent, sur la deuxième fonction, cette liste modifiée est attribuée à l code>. Semble raisonnable. p> Comportement de la fonction que je n'ai pas untertand h1>
j code>) et obtenez: p> l code> est une liste vide au début de chaque appel de la fonction j code>. Lorsque je supprimai la clause if-clause, dans le corps de la fonction j code> la fonction est égale à la fonction f code> et donne la même sortie. Par conséquent, la clause IF-CLAUSE semble avoir un effet secondaire. Test de len (l) == 0 code> au lieu de l == [] code> dans j code> a le même effet. P> liée à h1>
3 Réponses :
Si tout résume à ceci:
if L == [5]:
L[:] = []
Mon irritation est liée à la fonction j code> où nous testons si l == [] code>.
c'est la même chose. Le problème est que l nom est réaffecté (même chose répétée dans la réponse acceptée BTW)
Modifiez vos instructions d'impression pour imprimer également ID (L) CODE>: >>> j()
j, before if: [] 2844163925576
j, after if: [] 2844163967688
[5]
assigning default value inside b [10] [10] inside b [10, 10] [10, 10] inside b [10, 10, 10] [10, 10, 10]
Python 2.7 d'occasion afin de vérifier la syntaxe de vérification de l'impression si vous exécutez dans Python 3 ou plus
Ce serait plus facile à suivre si vous publiez une fonction i> dont vous ne comprenez pas le problème, expliquez votre problème avec cela et laissez toutes les autres fonctions.
Il n'est pas clair pour moi pourquoi c'était inattendu / contraire. Vous attendiez-vous
l = [] code> à l'intérieur de la fonction pour modifier la valeur par défaut liée?@khelwood j'ai enlevé la quatrième fonction.
@jonrsharpe Je m'attendrais à ce que la fonction
j code> a la même valeur de retour que la fonctionf code>. Cependant, ce n'est pas le cas. Les instructions d'impression dans l'organisme de fonction sont pourdébogage code>.Mais pourquoi i> vous attendiez-vous à cela? Quelle a été votre hypothèse pour la manière dont cela fonctionnerait qui vous a amené à attendre le même comportement?
@ Daniel.neumann Je voulais dire laisser tomber toutes les autres fonctions i>, à l'exception de celle que vous demandez. Et expliquez clairement pourquoi le comportement vous confond.
@khelwood a mis à jour en conséquence.
@jonrsharpe Le
l code> devient initialisé différemment en fonction de la clausesi code> dans le corps de la fonction. Veuillez comparer les lignesf, intérieures code> etj, avant si code> après le deuxième appel def code> etj code>. Dansf code> Lel code> est une liste avec la valeur5 code>. Dansj code> lel code> est une liste vide. Cependant, il devrait s'agir d'une liste[5] code>.pourquoi i> devrait-il être? Encore une fois, "Vous attendiez-vous
l = [] code> à l'intérieur de la fonction pour modifier la valeur par défaut liée?" I> (oul = [5] code> le même) au moment où vous semblez demander à "Quelle est la différence entre ajouter plusieurs articles à une seule liste et ajouter un seul élément à plusieurs listes" i> et la réponse semble évidente, alors je suis Essayer de comprendre où votre compréhension quitte ce qui se passe.@jonrsharpe Partie 1: Une liste vide
[] code> est initialisée sur le premier appel de la fonctionf code>. La valeur par défaut pourl code> est: pointez sur cette liste vide. Dans le corps def code>, nous appouverons une valeur à la liste et renvoyez-la. Sur le deuxième appel def code>, la liste vide[] code> n'est pas nouvellement initialisée maisl code> pointe vers l'emplacement dans la mémoire où la liste vide était initialement initialisé. Depuis le premier appel deF code> cette liste n'est plus vide. Par conséquent,l code> n'a pas la valeur d'une liste vide mais une liste avec une seule valeur. Si nous appelonsf code> dix fois, nous nous retrouverons avec une liste de dix éléments.@ daniel.neumann no, par La question vous ' VE lié à i> La liste vide est initialisée lorsque la fonction est créée i>, pas quand il est appelé.
@jonrsharpe Partie 2: Nous examinons maintenant
j code>. Je m'attendais àj code> pour fonctionner de la même manière. Au moins l'instruction d'impression avant lesi code> -clause devrait générer[5] code> dans le deuxième appel dej code>.@jonrsharpe Alors que je tape ces commentaires, la question a été répondue par GlibDudd. La liste (vers laquelle
l code> pointe) modifiée dansj code> n'est pas la liste définie comme valeur par défaut.On a l'impression que vous pourriez avoir répondu à "oui" soit dans la fois que j'ai demandé et sauvé un peu de dactylographie. La même réponse a été fournie il y a quelque temps par Jean-François aussi