Domanda

    

Questa domanda ha già una risposta qui:

         

Sto cercando di capire questo:

c = 1
def f(n):
    print c + n 
def g(n):
    c = c + n

f(1) => 2
g(1) => UnboundLocalError: local variable 'c' referenced before assignment

Grazie!

È stato utile?

Soluzione

All'interno di una funzione, le variabili assegnate sono trattate come variabili locali per impostazione predefinita. Per assegnare a variabili globali, utilizzare il global dichiarazione:

def g(n):
    global c
    c = c + n

Questa è una delle aree bizzarre di Python che non è mai stata molto adatta a me.

Altri suggerimenti

Lo stato globale è qualcosa da evitare, in particolare la necessità di mutarlo. Considera se g () dovrebbe semplicemente prendere due parametri o se f () e g () devono essere metodi di una classe comune con < codice> c un attributo di istanza

class A:
    c = 1
    def f(self, n):
        print self.c + n
    def g(self, n):
        self.c += n

a = A()
a.f(1)
a.g(1)
a.f(1)

Uscite:

2
3

Errata per Post di Greg :

Non ci dovrebbero essere prima che vengano referenziati . Guarda:

x = 1
def explode():
    print x # raises UnboundLocalError here
    x = 2

Esplode, anche se x viene assegnato dopo il riferimento. In Python la variabile può essere locale o fare riferimento a ambito esterno e non può cambiare in una funzione.

Diverso da quello che Greg ha detto, in Python 3.0, ci sarà l'istruzione non locale per dichiarare "qui ci sono alcuni nomi che sono definiti nell'ambito compreso". A differenza del globale, questi nomi devono essere già definiti al di fuori dell'ambito attuale. Sarà facile rintracciare nomi e variabili. Al giorno d'oggi non puoi essere sicuro di dove " globals qualcosa " è esattamente definito.

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