2015-09-10 1 views
3

Je voudrais construire un prototype en tant que tel:Liste de construction dans la définition de la fonction Python

def foo(a,t=([0]*len(a))): 
    print t 

Pour des raisons qui ne sont pas importantes pour le moment. Je passe des arguments de liste de longueur variable à. Cependant, Python sous Linux 2.7.10 revient toujours comme suit:

>>> a = [1,2,3,4] 
>>> foo(a) 
[O, 0] 

Sans l'appel de fonction, rien de tout cela se comporte d'une manière inattendue. Qu'est-ce qui se passe qui fait que Python pense toujours que la liste passée est de longueur 2 lors de l'assignation de variable dans foo()?

Répondre

6

Vous ne pouvez pas faire ce que vous voulez, car les fonctions par défaut sont exécutées au moment où la fonction est créée, et non lorsqu'elle est appelée.

Créer la liste en la fonction:

def foo(a, t=None): 
    if t is None: 
     t = [0] * len(a) 
    print t 

None est une sentinelle utile ici; si t est réglé sur None, aucune valeur n'a été spécifiée, donc vous créez une nouvelle liste pour la remplacer. Cela évite également de stocker un mutable par défaut (voir "Least Astonishment" and the Mutable Default Argument pourquoi cela pourrait ne pas être une bonne idée).

Votre exemple seulement aurait pu fonctionner si vous aviez déjà défini a à l'avant:

>>> def foo(a,t=([0]*len(a))): 
... print t 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'a' is not defined 
>>> a = [1, 2] 
>>> def foo(a,t=([0]*len(a))): 
... print t 
... 
+0

haut et fort, merci – errolflynn