variable - Scoping in Python 'for' loop
python variables scope function (4)
La risposta più probabile è che mantiene semplicemente la grammatica semplice, non è stato un ostacolo per l'adozione e molti sono stati contenti di non dover disambiguare l'ambito a cui appartiene un nome quando lo si assegna all'interno di un costrutto di loop. Le variabili non sono dichiarate all'interno di un ambito, è implicita dall'ubicazione delle dichiarazioni di assegnazione. La parola chiave global
esiste solo per questo motivo (per indicare che l'assegnazione è fatta in un ambito globale).
Aggiornare
Ecco una buona discussione sull'argomento: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html
Le precedenti proposte per rendere le variabili for-loop locali al ciclo si sono imbattute nel problema del codice esistente che si basa sulla variabile loop che mantiene il suo valore dopo aver chiuso il ciclo e sembra che questa sia considerata una caratteristica desiderabile.
In breve, si può probabilmente dare la colpa alla comunità Python: P
Non sto chiedendo le regole di scoping di Python; Capisco generalmente come funziona lo scoping in Python per i loop. La mia domanda è perché le decisioni di progettazione sono state prese in questo modo. Ad esempio (nessun gioco di parole previsto):
for foo in xrange(10):
bar = 2
print(foo, bar)
Quanto sopra verrà stampato (9,2).
Questo mi sembra strano: "foo" sta solo controllando il loop e "bar" è stato definito all'interno del ciclo. Posso capire perché potrebbe essere necessario che la 'barra' sia accessibile al di fuori del ciclo (altrimenti, per i loop avremmo funzionalità molto limitate). Quello che non capisco è il motivo per cui è necessario che la variabile di controllo rimanga in ambito dopo che il ciclo è terminato. Nella mia esperienza, limita semplicemente lo spazio dei nomi globale e rende più difficile rintracciare gli errori che verrebbero rilevati dagli interpreti in altre lingue.
Per i principianti, se le variabili fossero locali ai loop, quei loop sarebbero inutili per la maggior parte delle programmazioni del mondo reale.
Nella situazione attuale:
# Sum the values 0..9
total = 0
for foo in xrange(10):
total = total + foo
print total
rendimento 45
. Ora, considera come funziona l'assegnazione in Python. Se le variabili del ciclo erano strettamente locali:
# Sum the values 0..9?
total = 0
for foo in xrange(10):
# Create a new integer object with value "total + foo" and bind it to a new
# loop-local variable named "total".
total = total + foo
print total
produce 0
, perché il total
all'interno del ciclo dopo l'assegnazione non è la stessa variabile del total
al di fuori del ciclo. Questo non sarebbe un comportamento ottimale o previsto.
Un caso veramente utile per questo è quando si usa enumerate
e si desidera il conteggio totale alla fine:
for count, x in enumerate(someiterator):
dosomething(count, x)
print "I did something {0} times".format(count)
È necessario? No. Ma sicuramente è conveniente.
Un'altra cosa di cui essere a conoscenza: in Python 2, trapelano anche le variabili nelle list comprehensions:
>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
9
Ma lo stesso non si applica a Python 3.
Una delle principali influenze di Python è l' ABC , un linguaggio sviluppato nei Paesi Bassi per insegnare i concetti di programmazione ai principianti. Il creatore di Python, Guido van Rossum, ha lavorato alla ABC per diversi anni negli anni '80. Non conosco quasi nulla dell'ABC, ma poiché è destinato ai principianti, suppongo che debba avere un numero limitato di ambiti, proprio come i primi BASIC.