2010-03-01 7 views
7

Ich entwickle gerade einige Dinge in Python und ich habe eine Frage über den Gültigkeitsbereich von Variablen.Korrektheit über Variablenbereich

Dies ist der Code:

a = None 
anything = False 
if anything: 
    a = 1 
else: 
    a = 2 

print a # prints 2 

Wenn ich den Code noch funktioniert nach wie vor die erste Zeile (a = None) entfernen. In diesem Fall würde ich die Variable jedoch innerhalb eines "if" -Blocks deklarieren, und in Bezug auf andere Sprachen wie Java wäre diese Variable nur innerhalb des "if" sichtbar.

Wie genau funktioniert das variable Scoping in Python und was ist der gute Weg, um in solchen Fällen zu programmieren?

Danke!

+2

Es gibt keine "Deklaration" einer Variablen in Python! –

Antwort

8

Als Faustregel sind Bereiche an drei Stellen geschaffen:

  1. Datei-Umfang - anders als Modul Anwendungsbereich
  2. Class-scope bekannt - erstellt innerhalb class Blöcke
  3. Function-scope - erstellt innerhalb def Blöcke

(Es gibt ein paar Ausnahmen von diesen.)

Die Zuweisung zu einem Namen wird im Namensbereich des Gültigkeitsbereichs reserviert, der bis zum Erreichen der ersten Zuweisung als ungebunden markiert wird.Bei einem mentalen Modell weisen Sie also Namen in einem Bereich Werte zu.

+1

Es gibt eigentlich vier Orte, der vierte ist Global Scope. Aber das hängt wirklich davon ab, ob Global für Sie ein Bereich ist. – jathanism

+1

Soweit ich globalen Bereich verstehe, ist es in der Regel auch mit Datei/Modul Umfang. Die Ausnahmen, die ich kenne, beinhalten die Übergabe eines Wörterbuchs für Globals in 'exec' oder' eval'. Aus dem Speicher wird der vierte Bereich in Generatorausdrücken gefunden, der es Iteratorvariablen nicht erlaubt zu entkommen. Und der fünfte ist der nicht-lokale Block für Schließungen - ich habe noch nie einen einfachen Weg gefunden, diesen zu erklären. –

+0

+1 Schöne Antwort. –

2

Ich glaube, dass Python Funktionsumfang für lokale Variablen verwendet. Das heißt, wenn Sie in einer bestimmten Funktion einer lokalen Variablen einen Wert zuweisen, steht sie ab diesem Moment in dieser Funktion zur Verfügung, bis sie zurückgegeben wird. Da beide Zweige Ihres Codes garantiert a zugewiesen werden, müssen Sie None zunächst nicht zu a zuweisen.

Beachten Sie, dass wenn Sie auch auf Variablen zugreifen können, die in äußeren Funktionen deklariert sind - mit anderen Worten, Python hat Closures.

def adder(first): 
    def add(second): 
     return first + second 

    return add 

Dies definiert eine Funktion namens Addierer. Wenn es mit einem Argument first aufgerufen wird, gibt es eine Funktion zurück, die jedes Argument, das es empfängt, zu first hinzufügt und diesen Wert zurückgibt. Zum Beispiel:

add_two = adder(2) 
add_three = adder(3) 
add_two(4) # = 6 
add_three(4) # = 7 

Doch obwohl Sie den Wert aus der äußeren Funktion lesen können, können Sie es nicht ändern (im Gegensatz zu vielen anderen Sprachen). Stellen Sie sich zum Beispiel vor, einen Akkumulator zu implementieren. Sie könnten Code wie so schreiben:

def accumulator(): 
    total = 0 
    def add(number): 
     total += number 
     return total 
    return add 

Leider versuchen, diesen Code führt zu einer Fehlermeldung zu verwenden:

UnboundLocalError: local variable 'total' referenced before assignment 

Dies ist, weil die Leitung total += number den Wert von total zu ändern versucht, welche nicht auf diese Weise in Python getan werden.

+0

Sie können tun, was Sie in Ihrem 'accumulator()' Beispiel benötigen, indem Sie 'nonlocal' verwenden (neu in Python 3). –

0

Python benötigt keine Variablen, die anfänglich deklariert werden, so dass Sie an beliebigen Stellen deklarieren und definieren können. Und ja, der Umfang ist Funktionsumfang, also wird es außerhalb der if sichtbar sein.

1

Es gibt kein Problem beim Zuweisen der Variablen im if Block.

In diesem Fall wird es auf beiden Zweigen zugewiesen, so dass Sie sehen können, dass es definitiv definiert wird, wenn Sie es drucken.

Wenn einer der Zweige zu a zuweisen nicht dann eine NameError Ausnahme auslösen würde, wenn Sie es nach diesem Zweig

0

i ganz Programmierer eines Anfängers sind versuchen zu drucken, aber für das, was ich weiß, in Python Private Variablen existieren nicht. Eine ausführliche Diskussion finden Sie in der Python-Dokumentation unter private variables.

nützliche Informationen finden Sie auch im Abschnitt "Bereiche und Namespaces" auf der gleichen Seite.

persönlich, ich schreiben Code wie die, die Sie jeden Tag ziemlich viel geschrieben, vor allem, wenn die Bedingung setzt eine Eingabe vom Benutzer in immer, zum Beispiel

if len(sys.argv)==2: 
    f = open(sys.argv[1], 'r') 
else: 
    print ('provide input file') 

i Variablen deklarieren, bevor sie für strukturierte Typen mit Zum Beispiel deklariere ich eine leere Liste, bevor ich ihre Elemente innerhalb einer Schleife anhefte.

hoffe es hilft.