Perché Python dà 'can only concatenate list (not "str") to list' quando sommo liste?

👤 Iniziato da @ursulatosi
📅 11/09/2025 22:01
📁 Programmazione 🌐 IT
Avatar di ursulatosi
Ciao a tutti, sono alle prese con un errore in Python che non riesco a sbrogliare. Voglio aggiungere una stringa a una lista esistente usando l'operatore +=, ma continuo a ricevere questo errore:

```python
lista = [1, 2, 3]
lista += "ciao"
```

Errore completo:
TypeError: can only concatenate list (not "str") to list

Ho provato anche con l'operatore + direttamente (`lista = lista + "ciao"`) ma stesso risultato. So che potrei usare `append()` o `extend()`, ma sono testarda e voglio capire perché questo approccio non funziona. Dopotutto, se scrivo `lista += ["ciao"]` tutto va bene! Ho controllato la documentazione di Python 3.9 e alcuni tutorial, ma non trovo una spiegazione chiara sulla differenza di comportamento. È normale che Python tratti gli operatori in questo modo con i tipi diversi? O sto ignorando qualcosa di fondamentale? Se avete esperienze simili o conoscete una soluzione elegante, illuminatemi!
Avatar di asiasorrentino29
Ah, capisco la frustrazione! Python è un linguaggio fantastico ma ha le sue stranezze. Il punto è che `+=` per le liste è come un `extend()`, non un `append()`. Quando fai `lista += "ciao"`, Python cerca di iterare su "ciao" (che è una sequenza di caratteri) e aggiungere ogni elemento alla lista, ma vuole che tu sia esplicita sul fatto che stai aggiungendo una sequenza, non una stringa nuda.

Ecco perché `lista += ["ciao"]` funziona: stai passando una lista (iterabile) contenente la stringa, non la stringa direttamente. Se vuoi proprio usare `+=`, devi racchiudere la stringa in una lista o usare `extend(["ciao"])`.

Ma se vuoi aggiungere la stringa come singolo elemento, `append()` è la scelta più pulita. Python è coerente qui: `+` e `+=` con liste vogliono solo liste, non miscele di tipi. Se insisti a usare `+=`, fai così: `lista += ["ciao"]` e via!

P.S.: La testardaggine è una qualità, ma con Python a volte bisogna piegarsi alle sue regole! 😉
Avatar di gilloferrari22
Ecco, ti spiego senza giri di parole: Python è coerente ma rigido su sta roba. L'operatore `+=` per le liste vuole un iterabile, e una stringa è tecnicamente un iterabile di caratteri. Ma Python non fa magie: se vuoi concatenare liste, devi passargli una lista, punto.

Quel `lista += "ciao"` fallisce perché internamente Python prova a fare `extend("ciao")`, cioè vorrebbe aggiungere 'c', 'i', 'a', 'o' come elementi separati, ma non è quello che vuoi tu. Con `["ciao"]` invece gli dici chiaramente "aggiungi QUESTA lista", ed è per quello che funziona.

Se vuoi la stringa come elemento unico, usa `append()`. Se proprio vuoi insistere con `+=`, incapsula la stringa in una lista come hai già visto. Non è una stranezza, è il design del linguaggio: `+`/`+=` tra liste accettano solo liste, altrimenti diventa un casino di ambiguità.

P.S.: La documentazione ufficiale è chiara, ma se cerchi "list concatenation" trovi tutto. E sì, Python a volte sembra rompicoglioni, ma ha le sue ragioni.
Avatar di alexpiras63
Python non è stronzo, è logico. L’errore ti dice che `+=` sulle liste richiede un altro oggetto lista a destra, non una stringa nuda. Quando fai `lista += ["ciao"]`, stai estendendo la lista con un elemento, ma se usi `"ciao"` senza parentesi, Python lo vede come un iterabile di caratteri e prova a sputtanarti aggiungendo 'c', 'i', 'a', 'o' singolarmente. Vuoi la stringa intera? Usa `append("ciao")`. Vuoi il `+=`? Devi incasellarla in una lista, tipo `lista += ["ciao"]`, altrimenti il linguaggio va in tilt per ambiguità. Append() aggiunge un elemento, extend() aggiunge iterabili: è una distinzione che salva il mondo da errori surreali. La testardaggine va bene, ma qua non c’è magia, solo sintassi. La documentazione è chiara, ma forse sei andata a cercare nel buio: prova a googlare “python list concatenation type error” e vedrai che non sei sola. Sgamo il gioco, Python non è un mistero, è un contratto.
Avatar di ursulatosi
Ah, alexpiras63, grazie per la spiegazione dettagliatissima! Hai ragione, alla fine è tutto una questione di sintassi: non avevo considerato che `+=` si aspetta un iterabile e "ciao" è visto come sequenza di caratteri. Il mio errore era proprio voler forzare `+=` con una stringa nuda senza metterla in lista. La differenza tra `append()` e `extend()` adesso è cristallina – ammetto di essermi intestardita su `+=` senza motivo.
Hai centrato il punto: cercavo soluzioni complesse quando bastava un `lista.append("ciao")` o un `+= ["ciao"]`. E sì, googlando l'errore ho visto che è una trappola comune. Grazie per avermi fatto aprire gli occhi, Python è logico più che stronzo, sono io che ho letto male il contratto!

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!