Come utente, piuttosto che come designer, di Python ci sono tre motivi per cui sono contento di queste decisioni:
Principalmente, si legge meglio. Ovviamente, devo decidere consapevolmente di introdurre una nuova variabile quando scrive , ma il codice viene letto molto più spesso di quanto non sia scritto. Un sacco di codice è semplice nel senso che il controllo del flusso e della nidificazione non ha alcuna influenza sul significato e sull'esistenza delle variabili. Quando leggo
it = Snark()
message = "A letter, not signed"
if random.random() > 0.5:
hunt(it)
message += " (by the Knave)"
return [it, message]
quindi di solito non mi interessa davvero quale (se del caso) menzione di un nome lo introduce per la prima volta, mi interessa solo che sia lì e che cosa accada.
Si noti che un corpo significativo di pseudo-codice usa la stessa convenzione (nessuna dichiarazione, introduzione implicita tramite assegnazione) e Python è spesso descritto come pseudo-codice eseguibile, solo per metà scherzoso. Quattro caratteri extra per la variabile locale ogni , ai miei occhi viziati, si sentono come un disordine significativo nel contesto di Python, specialmente quando non sento come se aggiungesse qualsiasi valore (vedi sotto); questo sarebbe diminuito da un operatore :=
come in Go.
In secondo luogo, devo ancora incontrare un errore di battitura (dovuto a questa caratteristica specifica) che non si è mostrato anche in un altro modo chiaro. Forse cambierò idea in qualche altro anno in cui ho incontrato alcuni bug di questo tipo, ma finora è molto, molto in basso nella mia lista di cose che causano bug. C'è un buon numero di domande su UnboundLocalError
ed è un po 'complicato da spiegare ai principianti, ma la frequenza e la popolarità di queste domande, rispetto ad altri trucchi (parametri di default mutabili, semantica di riferimento, variabili di classe vs istanza) indica che è un raro problema.
Finalmente, l'intento ... scusa ma non riesco davvero a capirlo. Durante la lettura e la scrittura di Python, è sempre perfettamente chiaro: ciò a cui si assegna è inteso come locale, a meno che non sia dichiarato esplicitamente e in modo esplicito. Nessuna domanda al riguardo. Inoltre, poiché (almeno in Python) una variabile è locale per la funzione intera o per nulla , non puoi avere codice complicato che usa una variabile locale in un ramo e uno globale in un altro. Vedi un nome assegnato? Saprai immediatamente che era sempre locale dall'inizio. Bene, a meno che il codice non sia spezzato in un modo molto speciale (e lanciamo il temuto UnboundLocalError
in fase di esecuzione, quando si inseriscono quei casi).