piège d'argument par défaut de python

emballer

prendre au piège

C'est une histoire qu'il y a un piège pour passer la valeur du système de référence à l'argument par défaut.

def hoge(lst=[]):
    lst.append('hoge')
    print(lst)

hoge()
hoge()

Puisque lst est un tableau vide par défaut, vous verrez probablement ['hoge'] deux fois.

Résultat d'exécution


['hoge']
['hoge', 'hoge']

La deuxième fois, 2 hoge sont attachés.

Raison

Modifions un peu le code précédent et faisons ceci.

def called():
    print('called!')
    return []

def hoge(lst=called()):
    lst.append('hoge')
    print(lst)

hoge()
hoge()

Le résultat est comme ça.

Résultat d'exécution


called!
['hoge']
['hoge', 'hoge']

À propos, appelé est affiché sans hoge ().

En d'autres termes, il semble que la valeur de l'argument par défaut soit appelée et générée une seule fois lorsque la fonction est définie, et la valeur déjà générée est utilisée lors de l'appel de la fonction.

Comme indiqué ci-dessus, le modèle selon lequel "" [] "est donné comme argument par défaut et l'instance de liste est partagée par tous les appels de fonction qui ne spécifient pas d'argument semble être commun.

Je suis désolé si c'est du bon sens.

Recommended Posts

piège d'argument par défaut de python
Comportement des arguments par défaut de Python
Résumé des arguments de la fonction Python
Python ou et et opérateur trap
Piège de tableau bidimensionnel Python [copie du tableau]
Traitement des arguments de ligne de commande (docopt Python)
[python] Fonction de rappel (passez la fonction en argument)
Soyez prudent lorsque vous spécifiez la valeur d'argument par défaut dans la série Python 3
Définition du type d'argument de fonction en python
Python
Extension du dictionnaire python par argument
Changer le codage par défaut de python en utf-8
[Raspberry Pi] Changement par défaut de Python en Python3
[Python] Vérification simple du type d'argument avec la classe de données
La chaîne Python devient une chaîne f par défaut (peut-être)
Exemple de script pour piéger les signaux en Python
⚠️ Méfiez-vous des valeurs d'argument par défaut de Python ⚠️
Pour définir le codage par défaut sur utf-8 en python
Rendre la valeur par défaut de l'argument immuable