2016-06-20 5 views
0

Ich bin verwirrt über den Umfang der Python-Variablen. Wie wird diese ArbeitUmfang der Python-Variablen in diesem Fall - Unterschied zwischen umschließenden und lokalen Variablen

Betrachten Sie das folgende Beispiel

i = 12 
if i==12 : 
    str = "is equal" 
else: 
    str = "NOT" 
print str //Prints is equal - recognized the string str 

Die Variable str ist nur im Rahmen der if-Anweisung und deren Umfang an der else-Anweisung verloren. Da gibt es kein Hochziehen in Python. Ich bin verwirrt, wie dieses Beispiel this Post lesen works.I und es heißt, dass Variablen in der folgenden Reihenfolge

1-L (lokale Variablen werden bevorzugt)

2-E (Enclosing Variablen) scoped sind

3-G (globale Variablen)

4-B (Builtin)

Meine Frage ist, was ist der Unterschied zwischen umschließender Variable und lokaler Variable?

Antwort

4

Die Variable str ist nur im Bereich von if-Anweisung und ihr Bereich ist in der else-Anweisung verloren.

Nein. Python ist Funktionsbereich, nicht Blockbereich. Wenn Sie einen if-Block eingeben, wird kein neuer Bereich erstellt, sodass die str-Variable weiterhin für die print gilt.

Umschließende Variablen sind Variablen aus Funktionen, die eine bestimmte Funktion einschließen. Sie treten auf, wenn Sie Verschlüsse haben:

def f(): 
    x = 3 
    def g(): 
     print x # enclosing variable 
    g() 
+0

Danke für das Aufräumen - als Antwort markiert –

1

Python hat keinen allgemeinen Block Spielraum für nur Funktionsumfang (mit einiger zusätzlichen Seltsamkeit für Fälle wie class Erklärungen). Jeder in einer Funktion zugewiesene Name bleibt für die Lebensdauer der Funktion gültig.

Enclosing Umfang gilt, wenn Funktionsdeklarationen nisten, zB:

def foo(a): 
    def bar(b): 
     return a + b 
    return bar 

So in diesem Fall foo(1)(2) schaffen wird eine bar deren umgebenden Gültigkeitsbereich ist ein foo Anruf mit a == 1, dann bar(2) nennen, die a sehen als 1.

Der umschließende Bereich gilt auch für lambda Funktionen; sie können Variablen zur Verfügung im Rahmen lesen Sie den Punkt umgibt, wo lambda verwendet wurde, also so etwas wie:

val_to_key = {...} # Some dictionary mapping values to sort key values 
mylist.sort(key=lambda x: val_to_key[x]) 

val_to_key zur Verfügung steht; Es wäre nicht in Bereich innerhalb der sort-Funktion, aber die lambda-Funktion bindet den umschließenden Bereich zur Deklaration Zeit und kann daher val_to_key verwenden.

Verwandte Themen