2010-10-18 18 views
30

Ho cercato array passanti, o liste, come Python tende a chiamarli, in una funzione.Passare una matrice/lista in Python

ho letto qualcosa su come utilizzare args *, come ad esempio:

def someFunc(*args) 
    for x in args 
     print x 

ma non è sicuro se questo è giusto/sbagliato. Niente sembra funzionare come voglio. Sono abituato a passare facilmente gli array alla funzione PHP e questo mi confonde. Sembra anche che non posso fare questo:

def someFunc(*args, someString) 

Come si genera un errore.

Penso di essermi appena completamente confuso e in cerca di qualcuno che possa chiarirlo.

+1

http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists brevemente i dettagli per utilizzare l'asterisco. Significa che puoi passare una quantità arbitraria di argomenti, e saranno racchiusi in una tupla (a cui si può accedere come una lista all'interno della funzione). Un nome di argomento con un asterisco deve venire per ultimo, quindi Python sa quale è quale. – JAL

+0

"come Python tende a chiamarli"? Non è una "tendenza". È una questione di definizione. –

+5

S.Lascia, calmati! Penso che tu sia un po 'duro lì - il commento ha aggiunto qualcosa alla conversazione? no. –

risposta

41

Quando si definisce la funzione utilizzando la seguente sintassi:

def someFunc(*args) 
    for x in args 
     print x 

Stai dicendo esso che si si aspettano un numero variabile di argomenti. Se si desidera passare a un elenco (Array da altre lingue) ci si fa qualcosa di simile:

def someFunc(myList = [], *args) 
    for x in myList: 
     print x 

Poi si può chiamare con questo:

items = [1,2,3,4,5] 

someFunc(items) 

È necessario definire argomenti con nome prima degli argomenti variabili e degli argomenti variabili prima degli argomenti delle parole chiave. Si può anche avere questo:

def someFunc(arg1, arg2, arg3, *args, **kwargs) 
    for x in args 
     print x 

Che richiede almeno tre argomenti e supporta numeri variabili di altri argomenti e argomenti di parole chiave.

+8

Attenzione all'utilizzo di oggetti mutabili come argomenti predefiniti! someFunc chiamato due volte senza argomento restituirà [1, 1], perché gli argomenti predefiniti, sono costruiti solo una volta, quando viene valutata la definizione della funzione. –

13

È possibile passare le liste, proprio come gli altri tipi:

l = [1,2,3] 

def stuff(a): 
    for x in a: 
     print a 


stuff(l) 

Questa stampa la lista l. Tieni presente che gli elenchi vengono passati come riferimenti non come una copia profonda.

+1

@ S.Lott: Sì. Intendevo una copia profonda ... grazie per averlo capito. – JoshD

4

Non è necessario utilizzare l'asterisco per accettare un elenco.

Basta dare l'argomento un nome nella definizione e passare in una lista come

def takes_list(a_list): 
    for item in a_list: 
     print item 
7

Gli elenchi Python (che non sono solo matrici perché la loro dimensione può essere modificata al volo) sono normali oggetti Python e possono essere passati a funzioni come qualsiasi variabile. La sintassi * viene utilizzata per gli elenchi di disimballaggio, che probabilmente non è qualcosa che si desidera fare ora.

Problemi correlati