2015-08-21 4 views
7

Ho visto persone che utilizzano [:] per fare una copia rondine di una lista, come:assegnare il valore di un elenco utilizzando la notazione fetta con cessionario

>>> a = [1,2,3,4] 
>>> b = a[:] 
>>> a[0] = 5 
>>> print a 
[5, 2, 3, 4] 
>>> print b 
[1, 2, 3, 4] 

lo capisco. Tuttavia, ho visto pleople usando questa notazione quando si assegnano alle liste pure, come:

>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> a[:] = b 
>>> print a 
[4, 5, 6, 7] 
>>> print b 
[4, 5, 6, 7] 

Ma io non capisco il motivo per cui usano [:] qui. C'è una differenza che non conosco?

risposta

7

Ci è davvero una differenza tra a[:] = b e a = b.

>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> c = [8,9,0,1] 
>>> c = b 
>>> a[:] = b 
>>> b[0] = 0 
>>> a 
[4, 5, 6, 7] 
>>> c 
[0, 5, 6, 7] 
>>> 

Quando si scrive a = b, a è un riferimento alla medesima lista di B: ogni modifica b interesserà un

quando si scrive a[:] = b a è una lista inizializzata con gli elementi di B: un cambiamento in B non c'è influenzare un


e anche una differenza tra a[:] = b e a = b[:].

>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> c = a 
>>> a = b[:] 
>>> a 
[4, 5, 6, 7] 
>>> c 
[1, 2, 3, 4] 
>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> c = a 
>>> a[:] = b 
>>> a 
[4, 5, 6, 7] 
>>> c 
[4, 5, 6, 7] 

Con a = b[:], si crea un nuovo elenco con gli elementi di B, se un'altra variabile indicò una che non è influenzata

Con a[:] = b, si modificano gli elementi di una. Se anche un'altra variabile punta a a viene cambiata.

2

È più su come si copia la lista di qualsiasi altra cosa. Esempio:

>>> a = [1, 2, 3, 4] 
>>> b = [4, 5, 6, 7] 
>>> a = b 
>>> b[0] = 9 
>>> a 
[9, 5, 6, 7] 
>>> b 
[9, 5, 6, 7] 

Qui, a ora fa riferimento b, in modo da cambiare un valore di b influirà anche a.

>>> a = [1, 2, 3, 4] 
>>> b = [4, 5, 6, 7] 
>>> a[:] = b 
>>> b[0] = 9 
>>> a 
[4, 5, 6, 7] 
>>> b 
[9, 5, 6, 7] 

Nel caso di utilizzo di affettare, è solo una copia degli elementi della lista, quindi un cambiamento di b non influenzerà a. Spero che questo aiuti a chiarire le cose.

+1

È una copia poco profonda nel tuo secondo esempio, la prima crea un riferimento –

+1

Risolto, grazie per la correzione – maccartm

4

Sì, quando si utilizza [:] nella parte sinistra, modifica (muta) l'elenco in posizione, invece di assegnare un nuovo elenco al nome (variabile). Per vedere che, provare il seguente codice -

a = [1,2,3,4] 
b = a 
a[:] = [5,4,3,2] 
print(a) 
print(b) 

Si potrebbe vedere sia 'a' e 'b' cambiato.

Per vedere la differenza tra sopra e assegnazione normale, provare il codice qui sotto out -

a = [1,2,3,4] 
b = a 
a = [5,4,3,2] 
print(a) 
print(b) 

Vedrete che solo 'a' è cambiato, 'b' ancora puntare a [1,2,3,4]

+0

Penso che vuoi dire che non vedrei entrambi cambiati?Poiché 'a [:]' è una copia ingoiata di se stessa che non punta più a 'b'? – XNor

+0

Provalo prima. –

+1

Se utilizzati sul lato sinistro dell'operatore di assegnazione, non creano copie. Stanno per mutare la lista in atto. –