Dans le code suivant, une valeur aléatoire est générée comme prévu: 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 Réponses :
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)
Choisissez cela comme la réponse car il indique quand / comment VAL B> est évalué. Je comprends que c'est comme une variable locale statique i>
@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 i> n'est pas assez précis, plutôt que la fonction f code> devient un objet et la liste d'arguments et les paramètres par défaut deviennent des attributs de cet objet.
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()
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.
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
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