"Lokale Variable referenziert vor Zuordnung" – nur Funktionen?

Nehmen Sie den folgenden Code:

import something def Foo(): something = something.SomeClass() return something 

… das ist anscheinend nicht gültig code:

 UnboundLocalError: local variable 'something' referenced before assignment 

… als die lokale Variable something erstellt wird, aber nicht zugeordnet, bevor die RHS der = ausgewertet wird. (Siehe z. B. die Anmerkung der verwandten Antwort .) Das scheint mir etwas seltsam zu sein, aber sicher, ich gehe damit. Nun, warum ist der folgende gültige Code?

 class Foo(object): something = something.SomeClass() 

Mein Verständnis war, dass das Innere einer class im Wesentlichen ein Geltungsbereich war:

Die Suite der Klasse wird dann in einem neuen Ausführungsrahmen ausgeführt (siehe Abschnitt Benennen und Binden), mit einem neu erstellten lokalen Namespace und dem ursprünglichen globalen Namespace.

Also, warum, warum kodiert dieser Code anders als der einer Funktion?

2 Solutions collect form web for “"Lokale Variable referenziert vor Zuordnung" – nur Funktionen?”

Aus der pythonenklasse :

Klassendefinitionen setzen einen weiteren Namensraum im lokalen Bereich.

Ein besonderer Quirk von Python ist, dass – wenn keine globale Aussage in Kraft ist – Zuordnungen zu Namen immer in den innersten Bereich gehen. Zuweisungen kopieren keine Daten – sie binden nur Namen an Objekte. Das gleiche gilt für Deletionen: Die Anweisung del x entfernt die Bindung von x aus dem Namensraum, auf den der lokale Bereich verweist. In der Tat, alle Operationen, die neue Namen einführen, verwenden den lokalen Bereich: Insbesondere importieren Anweisungen und Funktionsdefinitionen das Modul oder den Funktionsnamen im lokalen Bereich. (Die globale Anweisung kann verwendet werden, um anzuzeigen, dass bestimmte Variablen im globalen Bereich leben.)

Also innerhalb einer Funktion (oder eines Geltungsbereichs) erzeugt die Zuweisung eine lokale ungebundene Variable, auf die zugegriffen wird, bevor sie gebunden ist, während sie in einer Klassendefinition einen Eintrag im "Namespace" -Logo dieser Klasse bei der Zuweisung erstellt und die Auflösung von something erlaubt Zum äußeren Namensraum (der Modulnamensraum).

Betrachten Sie das folgende Beispiel, das dazu beitragen kann, dies zu klären:

 import datetime class Foo(object): datetime = datetime.datetime >>> datetime <module 'datetime' from '/usr/lib/python2.6/lib-dynload/datetime.so'> >>> Foo.datetime <type 'datetime.datetime'> 

Beachten Sie, dass die Zeile datetime = datetime.datetime tatsächlich dem Namen Foo.datetime zuweist, der mit der globalen datetime nicht mehrdeutig ist (wie wäre es wenn derselbe Code in der Funktion wäre).

Zusammenfassend lässt sich feststellen, dass Klassendefinitionen einen neuen Namespace sowie einen neuen Geltungsbereich erstellen, so dass Sie in einem Umschließungsbereich direkt auf einen Namen zugreifen und denselben Namen im lokalen Bereich zuordnen können.

  • Python eval (kompilieren (...), Sandkasten), Globals gehen in Sandbox, wenn nicht in def, warum?
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Warum erbt keine Unterfunktion den Bereich in Python?
  • Wie kann ich auf eine Klassenvariable in einem Initialisierer in Python zugreifen?
  • Mit einer Variablen in einem Versuch, Fang, endgültige Aussage, ohne es draußen zu erklären
  • Scoping in Python 'für' Schleifen
  • Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?
  • __main__ und scoping in python
  • Python ist die beste Programmiersprache der Welt.