2008-09-28 8 views
38

Ich versuche, dies herauszufinden:Python Umfang

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 

Dank!

Antwort

51

Innerhalb einer Funktion werden Variablen, die zugewiesen werden, standardmäßig als lokale Variablen behandelt. So weisen auf globale Variablen, verwenden Sie die global Anweisung:

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

Dies ist eine der skurrilen Bereiche Python, die nie wirklich hat saß gut mit mir.

+0

Dies ist ähnlich zu PHP, es erfordert auch die Verwendung von 'global'. –

11

Der globale Status ist etwas zu vermeiden, insbesondere mutieren. Überlegen Sie, ob g() einfach zwei Parameter übernehmen soll, oder ob f() und g() müssen Methoden einer gemeinsamen Klasse sein, mit c eine Instanz Attribut

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) 

Ausgänge:

2 
3 
2

Andere als das, was Greg sagte, in Python 3.0, gibt es die nicht-lokale Anweisung zu sagen "Hier sind einige Namen, die im umschließenden Geltungsbereich definiert sind". Anders als global müssen diese Namen bereits außerhalb des aktuellen Gültigkeitsbereichs definiert sein. Es wird leicht sein, Namen und Variablen zu finden. Heutzutage kann man nicht sicher sein, wo "Globals etwas" genau definiert ist.

9

Errata für Greg's post:

sollte es keine sein, bevor sie referenziert werden. Werfen Sie einen Blick auf:

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

Es explodiert, auch wenn x zugeordnet ist, nachdem es referenziert ist. In Python kann die Variable lokal oder auf den äußeren Bereich verweisen, und sie kann nicht in einer Funktion geändert werden.