2.7. Liste

Una lista è una sequenza ordinata e mutabile di valori. A differenza delle stringhe e dei byte, le liste possono contenere valori di qualsiasi tipo, e puoi modificare, aggiungere o rimuovere elementi in posizione.

2.7.1. Creare liste

Le parentesi quadre creano una lista letterale:

empty   = []
nums    = [1, 2, 3]
mixed   = [1, "two", 3.0, True, None]    # any types
nested  = [[1, 2], [3, 4], [5, 6]]       # lists of lists

Il costruttore list costruisce una lista a partire da qualsiasi iterabile:

>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]

2.7.2. Lunghezza, indicizzazione e slicing

len() restituisce il numero di elementi. L’indicizzazione e lo slicing funzionano allo stesso modo delle stringhe – le posizioni partono da 0, gli indici negativi contano dalla fine, e una slice al di fuori dell’intervallo valido viene silenziosamente troncata anziché sollevare un errore:

>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Una lista di sei celle, con gli indici positivi 0..5 sopra e gli indici negativi -6..-1 sotto ogni cella.

Gli indici positivi contano dall’inizio; gli indici negativi contano dalla fine.

La sintassi della slice è una scorciatoia per un oggetto slice che Python costruisce dietro le quinte. nums[1:4] equivale a nums[slice(1, 4)]. Raramente ne costruisci uno a mano, ma slice() è occasionalmente utile per memorizzare una slice come valore da riutilizzare:

head = slice(0, 3)
print(nums[head])             # [10, 20, 30]
print(letters[head])          # first three letters, same slice

2.7.3. Modificare una lista

Le liste supportano l’assegnazione in posizione tramite indice e slice:

>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400]    # slice can change the length
>>> nums
[99, 200, 300, 400]

I metodi di lista più comuni:

  • list.append() – aggiunge un singolo elemento alla fine.

  • list.extend() – aggiunge in coda ogni elemento di un iterabile.

  • list.insert() – inserisce in una data posizione.

  • list.remove() – elimina la prima occorrenza di un valore.

  • list.pop() – rimuove e restituisce un elemento (l’ultimo per impostazione predefinita).

  • list.clear() – rimuove tutti gli elementi.

  • list.sort() – ordina in posizione. Passa reverse=True per l’ordine decrescente.

  • list.reverse() – inverte in posizione.

>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]

Questi metodi modificano la lista in posizione e restituiscono None. Scrivere

nums = nums.sort()    # nums is now None -- common bug

non è quasi mai ciò che desideri; la lista originale nums è stata ordinata, ma poi l’assegnazione sovrascrive il nome con il valore restituito. Chiama nums.sort() su una riga a sé, oppure usa la funzione predefinita sorted() per ottenere una nuova lista ordinata senza modificare l’originale.

2.7.4. Operatori

  • + concatena due liste in una nuova lista.

  • * ripete una lista.

  • in verifica l’appartenenza.

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True

2.7.5. Iterare su una lista

Un ciclo for percorre gli elementi in ordine:

for n in [10, 20, 30]:
    print(n)

2.7.6. Aliasing e mutazione

Una lista è un singolo valore in memoria; più nomi possono puntare alla stessa lista. La mutazione tramite un nome è visibile attraverso ogni altro nome che punta alla stessa lista.

Due variabili a e b che puntano entrambe allo stesso oggetto lista; l'aggiunta in coda ad a è visibile tramite b.

a e b puntano entrambi alla stessa lista. La mutazione tramite uno qualsiasi dei nomi cambia ciò che ogni altro nome vede.

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]                # same object, change is visible

Per creare una copia indipendente, esegui lo slice dell’intera lista o chiama il costruttore list:

>>> c = a[:]                # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4]                # c is unaffected

Questo copia solo la lista di primo livello; le liste annidate restano condivise tra l’originale e la copia.