2016-08-07 36 views
0

Ich bin ziemlich verwirrt darüber, wie die Regeln von LEGB hier gelten. I verstehen, dass Local innerhalb einer Funktion oder Klassenmethode, für Beispiel sein kann. Beiliegend kann seine umschließende Funktion sein, z.B. wenn eine Funktion in eine andere Funktion eingeschlossen ist. Global bezieht sich auf die oberste Ebene des ausführenden Skripts selbst, und Built-in sind spezielle Namen , die Python für sich reserviert. Ich verstehe einfach nicht, wie sie sich hier und> warum die Ausgabe ist, was esNamespace - Bereich python

a = 'global' 

def outer(): 

    def len(in_var): 
     print('called my len() function: ') 
     l = 0 
     for i in in_var: 
      l += 1 
     return l 

    a = 'local' 

    def inner(): 
     global len 
     nonlocal a 
     a += ' variable' 
    inner() 
    print('a is', a) 
    print(len(a)) 

outer() 

print(len(a)) 
print('a is', a) 

Ausgang

('a is', 'local') 
called my len() function: 
5 
15 
('a is', 'global variable') 
+0

Ich bekomme unterschiedliche Ausgabe in Python 3.5.2. –

Antwort

0

Ich erhalte folgendes Ergebnis mit 3.4.2

a is local variable 
called my len() function: 
14 
6 
a is global 
is.thanks

Für die Erklärung, tatsächlich haben Sie fast alle wichtigen Details, aber der Schlüsselpunkt ist nonlocal Anweisung bewirkt, dass der Bezeichner auf zuvor gebundene Variable im nächsten umschließenden Bereich, die m beziehen eans a in inner() bezieht sich auf und beeinflusst a = 'local' so danach; print('a is', a) verwendet eine als local variable und hat Länge 14. Im globalen Gültigkeitsbereich ist jedoch a = 'global' immer noch wirksam.

Können Sie uns bitte die Details Ihrer Umgebung mitteilen, damit wir den Unterschied untersuchen können?

+0

HI Heval. Danke. Ich benutze PyCharm 2016.2 und zeige auf Anaconda für die Module. Die Version von Python ist jedoch 2.7. Ich bin immer noch verwirrt, wie das Inkrement passiert, und die Reihenfolge der Ausgabe, obwohl ich dachte, ich verstehe die Regeln .. – uniXVanXcel

+1

Sind Sie sicher über Python 2.7? Afaik, nonlocal ist für diese Version nicht verfügbar, daher sollte ein Fehler auftreten. – Heval

+0

ja PyCharm hat diese Vorwärtskompatibilität, denke ich. PyCharm überprüft die Codekompatibilität gegen zwei oder mehr angegebene Python-Versionen. – uniXVanXcel