2015-01-26 12 views
5

Recentemente, sono andato a un colloquio di lavoro per una posizione sviluppatore Python. Il seguente codice era una delle domande. Ho appena dovuto scrivere l'output.Qualcuno può spiegarmi questo codice Python veramente di base?

def extendList(val,list=[]): 
    list.append(val) 
    return list 

list1 = extendList(10) 
list2 = extendList(123,[]) 
list3 = extendList('a') 

print "list1 = %s " %list1 
print "list2 = %s " %list2 
print "list2 = %s " %list3 

L'output è:

list1 = [10, 'a'] 
list2 = [123] 
list2 = [10, 'a'] 

Sto cercando di capire perché il primo elenco, list1, ha il valore 'a'.

EDIT

ho controllato tutti i link e ho scoperto la sua un pitone "Beccato" per principianti, ma voglio ringraziare le risposte, non riuscite a scegliere sia così ho intenzione con il primo.

+1

[ Questa risposta canonica] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument) dovrebbe aiutare –

+0

Duplicato di http://stackoverflow.com/q uestions/1132941/least-astonishment-in-python-the-mutable-default-argomento – davidism

+3

Solo perché è formulato in modo diverso non ne fa una domanda diversa. – davidism

risposta

1

list1 ha 'a' perché la lista creata con extendlist('a') è aggiungendo alla medesima lista di extendList(10)

Questo è senza dubbio il risultato di particolari nel modo in cui offerte di Python con argomenti di default ed è stato modello. Si potrebbe anche obiettare che questo è un bug, perché viola la proprietà di chiusura (se si suppone che i metodi di Python siano chiusure).

Ad esempio, il codice equivalente in Ruby:

def extendList(val, list=[]) 
    list << val 
    return list 
end 

rendimenti

extendList(10) 
# => [10] 

extendList(123, []) 
# => [123] 

extendList('a') 
# => ['a'] 

Questo è il caso in Ruby perché metodi rubino sono chiusure, cioè, ogni chiamata di metodo porta attorno il proprio locale ambiente.

+1

. . .e il 'print' non accade fino a dopo che tutti e 3' extendList' sono stati valutati. – WAF

1

In realtà, questo non è che di base, è un po 'una trappola pitone: Mutable Default Parameter

Confronta con la stampa al termine di ogni chiamata di funzione:

>>> def extendList(val,list=[]): 
...  list.append(val) 
...  return list 
... 
>>> list1 = extendList(10) 
>>> print "list1 = %s " %list1 
list1 = [10] 
>>> list2 = extendList(123,[]) 
>>> print "list2 = %s " %list2 
list2 = [123] 
>>> list3 = extendList('a') 
>>> print "list2 = %s " %list3 
list2 = [10, 'a'] 

anche:

>>> list1 is list2 
False 
>>> list1 is list3 
True 
+0

vedi, con questo codice non sto ottenendo il 'a' nella prima lista. WTF. jeje – NachoMiguel

Problemi correlati