2015-06-20 9 views
13

Python bietet die Funktion globals(), um auf ein Wörterbuch aller globalen Variablen zuzugreifen. Warum ist das eine Funktion und keine Variable? Die folgenden Arbeiten:Warum ist globals() eine Funktion in Python?

g = globals() 
g["foo"] = "bar" 
print foo # Works and outputs "bar" 

Was ist der Grund hinter dem Verbergen von Globalen in einer Funktion? Und ist es besser, es nur einmal anzurufen und irgendwo eine Referenz zu speichern oder sollte ich es jedes Mal aufrufen, wenn ich es brauche?

IMHO, das ist kein Duplikat von Reason for globals() in Python?, denn ich frage nicht, warum globals() existieren, sondern warum es eine Funktion sein muss (anstelle einer Variablen __globals__).

+1

Sie sollten selten auf Globals außerhalb des Debuggen überhaupt zugreifen müssen, ist dies verwandt http://stackoverflow.com/questions/12693606/reason-for-globals-in-python –

+0

Ich denke, wenn es eine Variable war, dann würde es in dem virtuellen Speicher unter Verwendung nützlichen Speicherplatzes gespeichert werden. Als eine Funktion erlaubt es Ihnen, diese Informationen zu speichern, wenn Sie sie wirklich brauchen (und nicht immer). Ich schätze, dass die Funktion geht und nach den globalen Variablen sucht. Also, wenn du es nicht nennst, wird kein zusätzlicher Speicher verwendet ... Ich bin mir nicht sicher über all das, es ist nur meine Vermutung. – tomasyany

+0

Ich denke, die Beantwortung dieser Frage erfordert spezifische historische Kenntnisse, aber da "Locals" eine Funktion sein muss (es muss das Diktat beim Aufruf aktualisieren), vermute ich, dass 'globals' eine Funktion für Symmetrie mit' local's ist. – user2357112

Antwort

17

Weil es von der Python-Implementierung abhängen kann, wie viel Arbeit es ist, dieses Wörterbuch zu bauen.

In CPython werden Globals nur in einem anderen Mapping beibehalten, und der Aufruf der Funktion globals() gibt einen Verweis auf dieses Mapping zurück. Andere Python-Implementierungen können jedoch bei Bedarf auf Wunsch ein separates Wörterbuch für das Objekt erstellen.

Dies spiegelt die locals()-Funktion wider, die in CPython ein Dictionary on demand erstellen muss, da Locals normalerweise in einem Array gespeichert sind (lokale Namen werden in CPython-Bytecode in Arrayzugriff übersetzt).

Sie würden also globals() aufrufen, wenn Sie Zugriff auf die Zuordnung von globalen Namen benötigen. Das Speichern eines Verweises auf dieses Mapping funktioniert in CPython, zählt aber in anderen Implementierungen nicht dazu.

+1

Wurde die Unterstützung anderer Python-Implementierungen sogar ein Problem, wenn "Globals" eingeführt wurde? – user2357112

+2

@ user2357112: Ich denke nicht, aber ich denke, es war wichtig, die interne Implementierung von globals frei von Annahmen zu halten. –

+0

Glaubst du, ich kann auf "globals() [" foo "] = 'bar'" in anderen Implementierungen arbeiten? –

Verwandte Themen