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]
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. Passareverse=Trueper 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.inverifica 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.
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.