0
votes

Fonction python argument par défaut valeur aléatoire

Dans le code suivant, une valeur aléatoire est générée comme prévu: xxx pré>

Cependant, cela ne fonctionne pas si j'utilise une fonction: p>

import random

def f(val: int = random.randint(0,10)):
    print(val)

for i in range(10):
    f()


3 commentaires

C'est parce que des arguments ne sont évalués qu'une seule fois. Vous pouvez rechercher "Arguments par défaut Python" pour plus.


Est-ce que cela répond à votre question? "moins étonnement" et l'argument par défaut mutable


@Mistermiyagi Cela m'a amené à cet article: effabot.org/zone/default-values.htm < / a>, qui répond à ma question. Mais au moment où je retourne au fil, il y a déjà des réponses. Merci de lier votre lecture suggérée


3 Réponses :


3
votes

L'expression d'argument par défaut n'est pas évaluée lorsque vous appelez em> la fonction, il est évalué lorsque vous créer em> la fonction. Donc, vous aurez toujours la même valeur, peu importe ce que vous faites.

Le moyen typique autour de cela consiste à utiliser une valeur d'indicateur et à le remplacer à l'intérieur du corps de la fonction: p>

def f(val=None):
    if val is None:
        val = random.randint(0,10)
    print(val)


2 commentaires

Choisissez cela comme la réponse car il indique quand / comment VAL est évalué. Je comprends que c'est comme une variable locale statique


@mushishi J'essaie toujours de souligner ce point, car je me connais bien avec C ++, ce qui le fait l'inverse - les arguments par défaut sont évalués au moment de l'appel. L'appelant un statique n'est pas assez précis, plutôt que la fonction f devient un objet et la liste d'arguments et les paramètres par défaut deviennent des attributs de cet objet.



0
votes

Vous voudrez que la valeur par défaut soit une valeur spécifique. Pour que cela soit dynamique comme ça, vous voudrez-y par défaut à autre chose, vérifiez cela, puis modifiez la valeur.

Par exemple: P>

import random

def f(val=None):
    if val is None:
        val = random.randint(0,10)
    print(val)

for i in range(10):
    f()


0 commentaires

0
votes

Le paramètre par défaut ne peut pas être modifié sur appel. Je ne comprends pas pourquoi cela avait besoin. vous pouvez faire simplement comme ça. XXX


1 commentaires

Ceci est une simplification excessive du code du monde réel. Je pourrais vérifier si l'argument par défaut est défini et si non, retourne; Mais j'étais curieux pourquoi je ne peux pas me sauver les deux lignes supplémentaires