2014-12-26 7 views
11

Non posso spiegare il seguente comportamento:Python: liste e copia del loro

l1 = [1, 2, 3, 4] 
l1[:][0] = 888 
print(l1) # [1, 2, 3, 4] 
l1[:] = [9, 8, 7, 6] 
print(l1) # [9, 8, 7, 6] 

Sembra essere che l1[:][0] si riferisce a una copia, mentre l1[:] si riferisce all'oggetto stesso.

+5

Vedere [List - Python tutorial] (https://docs.python.org/3/tutorial/introduction.html#lists), in particolare l'assegnazione a slice. – falsetru

risposta

6

l1[:][0] = 888 prima prende una fetta di tutti gli elementi in l1 (l1[:]), che (come per la semantica della lista) restituisce un nuovo oggetto lista contenente tutti gli oggetti in l1 - è una copia dei l1.

Sostituisce quindi il primo elemento di tale elenco copiato con il numero intero 888 ([0] = 888).

Quindi, l'elenco copiato viene scartato perché non viene fatto nulla con esso.

tuo secondo esempio l1[:] = [9, 8, 7, 6]sostituisce tutti gli elementi in l1 con quelli nell'elenco [9, 8, 7, 6]. È un compito da affettare.

+0

Grazie per la tua risposta. Il mio punto è che l1 [:] sembra comportarsi come una copia o come un riferimento a l1, a seconda del fatto che cambio un valore o riassegni l'intera lista. – fcracker79

+1

Fa sempre una copia di 'l1', tranne quando è l'obiettivo di un compito (il secondo esempio), nel qual caso sostituisce semplicemente l'intero contenuto di' l1'. –

12

Questo è causato dalla funzionalità di pitone che permette di assegnare un elenco di una fetta di un altro elenco, cioè

l1 = [1,2,3,4] 
l1[:2] = [9, 8] 
print(l1) 

imposterà l1 s' primi due valori 9 e 8 rispettivamente. Analogamente,

l1[:] = [9, 8, 7, 6] 

assegna nuovi valori per tutti gli elementi di l1.


Ulteriori informazioni sui compiti in the docs.

Problemi correlati