Quindi in una funzione l'aggiunta di un 6 al set non viene mostrata ma lo fa quando non è in una funzione?
No, non è quello che succede.
Ciò che accade è che, quando si esegue mylist = mylist + [6]
, si sta effettivamente creando un elenco completamente nuovo e lo si inserisce nella variabile locale mylist
. Questa variabile mylist
scomparirà dopo l'esecuzione della funzione e anche l'elenco appena creato svanirà.
OTOH quando si esegue mylist.append(6)
non si crea un nuovo elenco. Si ottiene l'elenco già nella variabile mylist
e si aggiunge un nuovo elemento a questo stesso elenco. Il risultato è che la lista (indicata anche da list2
) verrà modificata automaticamente. La variabile mylist
scomparirà di nuovo, ma in questo caso è stato modificato l'elenco originale.
Vediamo se una spiegazione più visiva può aiutare :)
Cosa succede quando si chiama proc()
Quando si scrive list1 = [1, 2, 3, 4, 5]
si sta creando un nuovo oggetto lista (sul lato destro delle pari firmare) e creare una nuova variabile, list1
, che punterà a questo oggetto.

Poi, quando si chiama proc()
, si crea un altro nuova variabile, mylist
, e dal momento che si passa list1
come parametro, mylist
punterà allo stesso oggetto:

Tuttavia , l'operazione mylist + [6]
crea un intero nuovo oggetto elenco il cui contenuto è il contenuto dell'oggetto indicato da mylist
più il contenuto del seguente oggetto elenco, ovvero [6]
. Dal momento che si attribuiscono questo nuovo oggetto mylist
, il nostro scenario cambia un po 'e mylist
non punta allo stesso oggetto puntato da list1
più:

Quello che non ho detto è che mylist
è una variabile locale : scomparirà dopo la fine della funzione proc()
. Così, quando l'esecuzione proc()
conclusa, il mylist
è andato:

Da altri punti variabile all'oggetto generato da mylist + [6]
, esso scompare anche (poiché il garbage collector * lo ritirerà):

noti che, alla fine, dell'oggetto puntato dal list1
non viene modificata.
Cosa succede quando si chiama proc2()
Tutto cambia quando si chiama proc2()
. In un primo momento, è la stessa cosa: si crea un elenco ...

... e passare come parametro ad una funzione, che genererà una variabile locale:

Tuttavia, anziché utilizzare l'operatore di concatenazione +
che genera un nuovo elenco, si applica il metodo append()
all'elenco esistente. Il metodo append()
non crea un nuovo oggetto; invece, esso _changes quella esistente:

Dopo la fine della funzione, la variabile locale scompare, ma l'oggetto originale puntato per esso e per list1
saranno già alterata:

Poiché è ancora puntato da list1
, l'elenco originale non viene distrutto.
EDIT: se si vuole dare un'occhiata a tutta questa roba accadendo davanti ai tuoi occhi basta andare a this radically amazing simulator:

* Se non si sa che cosa è garbage collector. .. beh, scoprirai subito dopo aver capito la tua domanda.
C'è anche un buon [servizio] (http://people.csail.mit.edu/pgbovine/python/tutor.html#mode=edit) per fare il codice python passo passo e osservare tutte le variabili nel browser! Molto vicino a quello che hai scritto, @brandizzi – stalk
+1 per un così bel disegno .. – gsagrawal
@stalk Non conoscevo questo servizio. è semplicemente fantastico! Grazie! – brandizzi