lo dici a te stesso che con la legge non c'è ambiguità e con scrive c'è. Pertanto è necessario un meccanismo per risolvere l'ambiguità con le scritture.
Un'opzione (probabilmente effettivamente utilizzata da versioni molto vecchie di Python, IIRC) è solo per dire che le scritture vanno sempre nello scope locale. Quindi non c'è bisogno di una parola chiave global
e nessuna ambiguità. Ma in questo caso non è possibile scrivere su variabili globali (senza usare cose come globals()
per ottenerle in modo approssimativo), quindi non sarebbe fantastico.
Un'altra opzione, utilizzata dalle lingue che dichiarano staticamente le variabili, consiste nel comunicare in anticipo all'implementazione del linguaggio per ogni ambito i nomi locali (quelli dichiarati in tale ambito) e quali nomi sono globali (nomi dichiarati in l'ambito del modulo). Ma Python non ha variabili dichiarate, quindi questa soluzione non funziona.
Un'altra opzione sarebbe quella di avere x = 3
assegnare a una variabile locale solo se non esiste già un nome in qualche ambito esterno con nome x
. Sembra che farebbe la cosa giusta in modo intuitivo? Tuttavia porterebbe ad alcuni casi d'angolo seriamente cattivi. Attualmente, dove x = 3
scrive in modo statico è determinato dal parser; o non c'è lo global x
nello stesso ambito ed è una scrittura locale, oppure c'è un global x
ed è una scrittura globale. Ma se ciò che farà dipende dall'ambito del modulo globale, è necessario attendere fino al runtime per determinare dove va la scrittura , il che significa che può cambiare tra le chiamate di una funzione. Pensaci. Ogni volta che crei un globale in un modulo, cambieresti il comportamento di tutte le funzioni nel modulo che stava usando quel nome come un nome di variabile locale. Fare qualche modulo ambito calcolo che utilizza tmp
come variabile temporanea e salutare utilizzando tmp
in tutte funzioni del modulo. E rabbrividisco nel pensare agli oscuri bug che riguardano l'assegnazione di un attributo su un modulo che hai importato e poi chiamare una funzione da quel modulo. Yuck.
E un'altra opzione è quella di comunicare alla implementazione del linguaggio su ogni incarico se debba essere locale o globale. Questo è ciò che Python è andato con. Dato che esiste un valore predefinito accettabile che copre quasi tutti i casi (scrivere su una variabile locale), abbiamo l'assegnazione locale come predefinito e contrassegniamo esplicitamente gli incarichi globali con global
.
C'è un'ambiguità con i compiti che hanno bisogno di un meccanismo per risolverlo. global
è uno di questi meccanismi. Non è l'unico possibile, ma nel contesto di Python, sembra che tutti i meccanismi alternativi siano orribili. Non so che tipo di "miglior motivo" tu stia cercando.
Per nascondere bug sottili? – Inverse