variable - Scoping in Python 'for' loop




python variables scope function (4)

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.


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


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.





scope