Cosa significa?


95

Sto analizzando del codice Python e non so cosa

pop = population[:]

si intende. È qualcosa come gli elenchi di array in Java o come un array bidimensionale?


1
Correlato, la cancellazione di un elenco è possibile solo eseguendo del pop [:] o pop [:] = [], non pop.clear () .. (come si fa con dict).
Macke

Buona discussione SO su slice Python: stackoverflow.com/questions/509211/…
Scott C Wilson

Risposte:


109

È un esempio di notazione slice e ciò che fa dipende dal tipo di population. Se populationè un elenco, questa riga creerà una copia superficiale dell'elenco. Per un oggetto di tipo tupleo a str, non farà nulla (la riga farà lo stesso senza [:]), e per un (diciamo) array NumPy, creerà una nuova visualizzazione degli stessi dati.


14
Per ogni evenienza: la fetta restituisce una copia superficiale.
André Caron

4
@ilius: Forse l.copy()è più leggibile, ma non funzionerà.
Sven Marnach

13
list(l)funziona sempre, è più leggibile ed è garantito per restituire una copia anche con qualcosa di similenumpy.array
Rosh Oxymoron

1
@Eli: Sì, a fianco list.clear(). Ci vorrà del tempo, tuttavia, prima che ciò porti a una significativa riduzione di questo tipo di domande sull'SO. :)
Sven Marnach

1
@MichaelGraczyk: presumo che tu stia parlando di array NumPy qui. Piuttosto che usare A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], preferirei quasi sempre numpy.rollaxis(A, axis, 0)[k]. In generale, raramente mi sono imbattuto in un caso d'uso in cui avresti bisogno di creare direttamente slice()oggetti. Se ne hai comunque bisogno, NumPy fornisce l' s_helper come un modo alternativo per crearli.
Sven Marnach

27

Potrebbe anche essere utile sapere che una sezione di elenco in generale fa una copia di una parte dell'elenco. Ad esempio population[2:4], restituirà un elenco contenente la popolazione [2] e la popolazione [3] (il taglio è esclusivo a destra). Tralasciando l'indice sinistro e destro, poiché population[:]sono predefiniti rispettivamente a 0 e lunghezza (popolazione), selezionando così l'intero elenco. Quindi questo è un linguaggio comune per creare una copia di un elenco.


15

beh ... questo dipende davvero dal contesto. Alla fine, passa aslice oggetto ( slice(None,None,None)) per uno dei seguenti metodi: __getitem__, __setitem__o __delitem__. (In realtà, se l'oggetto ha un __getslice__, verrà usato al posto di __getitem__, ma ora è deprecato e non dovrebbe essere usato).

Gli oggetti possono fare quello che vogliono con la fetta.

Nel contesto di:

x = obj[:]

Questo chiamerà obj.__getitem__con l'oggetto slice passato. In effetti, questo è completamente equivalente a:

x = obj[slice(None,None,None)]

(anche se il primo è probabilmente più efficiente perché non deve cercare il slicecostruttore - È tutto fatto in bytecode).

Per la maggior parte degli oggetti, questo è un modo per creare una copia superficiale di una parte della sequenza.

Il prossimo:

x[:] = obj

È un modo per impostare gli elementi (chiama __setitem__) in base a obj.

e, penso che tu possa probabilmente indovinare cosa:

del x[:]

chiama ;-).

Puoi anche passare diverse fette:

x[1:4]

costruisce slice(1,4,None)

x[::-1]

costrutti slice(None,None,-1)e così via. Ulteriori letture: Spiega la notazione slice di Python



6

Crea una copia dell'elenco, anziché semplicemente assegnare un nuovo nome per l'elenco già esistente.


5

[:]
usato per limitatore o affettamento in array, hash
ad esempio:
[1: 5] per visualizzare valori tra 1 incluso e 5 esclusivo cioè 1-4
[inizio: fine]

fondamentalmente usato nell'array per affettare, capire la parentesi accetta la variabile che significa valore o chiave da visualizzare e ":" viene utilizzato per limitare o suddividere l'intero array in pacchetti.


1
Non c'è motivo di respingere una domanda così vecchia che ha già 5 risposte simili e persino una accettata ... Inoltre, a[1:5]restituisce gli elementi 1-4, non 2-4.
Skamah One

@SkamahOne Oh non lo so. Forse non in questo caso, ma ci sono momenti in cui può essere utile sollevare domande morte. Intuizioni diverse, parole diverse ecc. In questo caso hai corretto la risposta e si spera che anche loro abbiano imparato qualcosa.
Pryftan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.