2015-04-30 20 views
32

A volte mi capita di imbattermi in questo modo di stampare o di restituire un elenco - someList[:]. Non vedo perché la gente lo usa, poiché restituisce l'elenco completo.Cosa fa questa notazione per gli elenchi in Python: "someList [:]"?

Perché non scrivere semplicemente someList, senza la parte [:]?

+0

ti riferisci a una lingua specifica? –

+5

possibile duplicato di [Come clonare o copiare un elenco in Python?] (Http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) –

+5

possibile duplicato di [Spiega la notazione della porzione di Python] (http://stackoverflow.com/questions/509211/explain-pythons-slice-notation) – LittlePanda

risposta

54

[:] crea una fetta, di solito utilizzato per ottenere solo una parte di una lista. Senza alcun indice minimo/massimo, crea una copia dell'intero elenco. Ecco una sessione di Python dimostrarlo:

>>> a = [1,2,3] 
>>> b1 = a 
>>> b2 = a[:] 
>>> b1.append(50) 
>>> b2.append(51) 
>>> a 
[1, 2, 3, 50] 
>>> b1 
[1, 2, 3, 50] 
>>> b2 
[1, 2, 3, 51] 

nota come aggiungendo alla b1 anche aggiunto il valore di a. L'aggiunta a b2 tuttavia non ha modificato a, ad esempio b2 è una copia.

+0

Grazie, Frerich, ho capito. In quei casi in cui mi sono imbattuto [:] è stato effettivamente utilizzato per fare una copia di una lista. –

+19

Probabilmente vale la pena menzionare che questo crea una copia * shallow * della lista, quindi il modello può incorrere in problemi se si dispone, ad esempio, di elenchi di elenchi. – sapi

+1

Da un punto di vista "esplicito è meglio che implicito", potrebbe essere preferibile "importare copia" e utilizzare "copia.copy (lst)" invece. La notazione di sezione non suggerisce ciò che fa ed è difficile da google. –

8

A creare una copia di un elenco anziché passare per riferimento, come fa Python. Usa i prossimi due esempi per capire la differenza.

Esempio:

# Passing by reference 
SomeListA = [1, 2, 3] 
SomeListB = [2, 3, 4] 
SomeListB = SomeListA 
SomeListA[2] = 5 
print SomeListB 
print SomeListA 

# Using slice 
SomeListA = [1, 2, 3] 
SomeListB = [2, 3, 4] 
SomeListB = SomeListA[:] 
SomeListA[2] = 5 
print SomeListB 
print SomeListA 
4

Quando è necessario modificare l'elenco e non si vuole modificare l'elenco e creare un altro elenco si utilizza

y = [1,2,3] 
x = y[:] 

e si può fare un sacco di cambiamenti alla lista ma la lista Origin essere in (y) e modificato in (x)

16

in Python, quando si esegue a = b, un non prende il valore di B, ma riferimenti lo stesso valore a cui fa riferimento b. Per vedere ciò, effettuare:

>>> a = {'Test': 42} 
>>> b = a 
>>> b['Test'] = 24 

Qual è ora il valore di a?

>>> a['Test'] 
24 

E 'simile con le liste, quindi dobbiamo trovare un modo per davvero copiare un elenco, e non fare un riferimento ad esso. Un modo potrebbe essere quello di ricreare l'elenco copy = list(list1) o utilizzare le funzioni del modulo copy. Ma, dopotutto, il modo più semplice, il più bello, il modo migliore (;)) per fare ciò, è copiare ogni valore della prima lista sull'altra, facendo copy = list1[:]. Usa le fette, qui list1 è affettato dall'indice 0 all'indice len (lista1), quindi viene restituita l'intera lista1!

Inoltre, il metodo slice è leggermente più veloce: utilizzando il metodo time.clock() per misurare il tempo medio di esecuzione di 1000 assegnazioni di elenchi, ciascuno contenente 10000 numeri interi casuali, con sezioni, costruttore e deepcopy, i risultati mostrano che le fette sono il 15% più veloci del metodo del costruttore e deepcopy è 4 volte più lento. Tuttavia, questo guadagno di tempo è trascurabile durante l'utilizzo di elenchi di piccole dimensioni: pertanto, l'utilizzo di copy = list(list_to_copy) o copy = list_to_copy[:] dipende dalle preferenze dello sviluppatore.

Infine, spesso dimentichiamo il metodo list.copy, che sembra essere il più veloce! In effetti, è persino il 13% più veloce del metodo slice!

+1

"(per oggetti mutabili ...)": per essere chiari, 'b = a' funziona esattamente allo stesso modo se' a' è mutabile o se 'a' è immutabile. – DSM

+0

@DSM Sì Hai ragione, lo correggerò! – Spirine

+0

Penso che "il modo più semplice, il più bello, il modo migliore" sia piuttosto soggettivo (e non sono d'accordo, mi piace 'list (a)' meglio di 'a [:]'). –