Domanda

Sto avendo terribili problemi cercando di capire le regole di scoping pitone.

Con il seguente script:

a = 7

def printA():
    print "Value of a is %d" % (a)

def setA(value):
    a = value
    print "Inside setA, a is now %d" %(a)


print "Before setA"
printA()
setA(42)
print "After setA"
printA()

Fornisce l'inaspettato (per me) Uscita di:

    Before setA
    Value of a is 7
    Inside setA, a is now 42
    After setA
    Value of a is 7

Dove mi aspetterei l'ultima stampa del valore di un essere 42, non 7. Che cosa mi manca circa le regole di ambito di Python per la scoping di variabili globali?

È stato utile?

Soluzione

Le variabili globali sono speciali. Se si tenta di assegnare a un a = value variabile all'interno di una funzione, si crea una nuova variabile locale all'interno della funzione, anche se v'è una variabile globale con lo stesso nome. Per accedere invece la variabile globale, aggiungere un'istruzione global all'interno del funzione:

a = 7
def setA(value):
    global a   # declare a to be a global
    a = value  # this sets the global value of a

e vincolante per una spiegazione dettagliata di denominazione di Python e regole vincolanti.

Altri suggerimenti

Il trucco per la comprensione di questo è che quando si assegna a una variabile, utilizzando =, si dichiara anche come una variabile locale. Così, invece di modificare il valore della variabile di globale, Seta (valore) in realtà imposta una variabile locale (che risulta essere chiamato a) al valore passato.

Questo diventa più evidente se si tenta di stampare il valore di un'all'inizio della Seta (valore) in questo modo:

def setA(value):
    print "Before assignment, a is %d" % (a)
    a = value
    print "Inside setA, a is now %d" % (a)

Se si tenta di eseguire questo Python vi darà un errore di utili:

Traceback (most recent call last):
  File "scopeTest.py", line 14, in 
    setA(42)
  File "scopeTest.py", line 7, in setA
    print "Before assignment, a is %d" % (a)
UnboundLocalError: local variable 'a' referenced before assignment

Questo ci dice che Python ha deciso che la funzione Seta (valore) ha una variabile locale chiamata, che è quello che si altera quando si assegna ad essa nella funzione. Se non si assegna a una nella funzione (come con Stampa ()) allora Python usa la variabile globale A.

Per marcare una variabile come globale è necessario utilizzare la parola chiave globale in Python, nel campo di applicazione che si desidera utilizzare la variabile globale . In questo caso che è all'interno della funzione Seta (valore). Quindi lo script diventa:

a = 7

def printA():
    print "Value of a is %d" % (a)

def setA(value):
    global a
    a = value
    print "Inside setA, a is now %d" %(a)


print "Before setA"
printA()
setA(42)
print "After setA"
printA()

Questa aggiunta linea dice Python che quando si utilizza la variabile a nella funzione Seta (valore), che si sta parlando della variabile globale, non una variabile locale.

Python non ha un concetto di variabili come altre lingue. Hai oggetti che sono "da qualche parte" e si dispone di riferimenti a questi oggetti. = Viene utilizzato per assegnare questi oggetti per riferimenti nella corrente namespace.

Si crea un nome di un nello spazio dei nomi della funzione di Seta, che fa riferimento all'oggetto a cui valore si riferisce.

all'interno della funzione, a è trattato come una variabile locale, è necessario definire

  

globale a

all'interno della funzione

L'esecuzione di una funzione introduce una nuova tabella di simbolo utilizzato per le variabili locali della funzione. Più precisamente, tutte le assegnazioni variabili in una funzione memorizzano il valore nella tabella dei simboli locale; considerando che qualsiasi riferimento a variabili cercano prima nella tabella dei simboli locale, poi nelle tabelle dei simboli locali di funzioni che racchiudono, poi nella tabella dei simboli globale, e, infine, nella tabella dei nomi built-in. Così, le variabili globali non possono essere assegnati direttamente un valore all'interno di una funzione (a meno che il nome in una dichiarazione globale), anche se possono fare riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top