Rinominerò le variabili per ridurre la confusione. n -> nf o nmain . x -> xf o xmain :
def f(nf, xf):
nf = 2
xf.append(4)
print 'In f():', nf, xf
def main():
nmain = 1
xmain = [0,1,2,3]
print 'Before:', nmain, xmain
f(nmain, xmain)
print 'After: ', nmain, xmain
main()
Quando chiamate la funzione f , il runtime di Python crea una copia di xmain e la assegna a xf , e allo stesso modo assegna una copia di nmain a nf .
Nel caso di n , il valore che viene copiato è 1.
Nel caso di x il valore che viene copiato non è l'elenco letterale [0, 1, 2, 3] . È un riferimento a tale elenco. xf e xmain indicano lo stesso elenco, quindi quando si modifica xf si modifica anche xmain .
Se, tuttavia, dovessi scrivere qualcosa del tipo:
xf = ["foo", "bar"]
xf.append(4)
scopriresti che xmain non è cambiato. Questo perché, nella riga xf = ["foo", "bar"] hai cambiato xf per puntare a un nuovo elenco. Qualsiasi modifica apportata a questo nuovo elenco non avrà alcun effetto sull'elenco a cui punta ancora xmain .
Spero che aiuti. :-)