2010-11-01 6 views
5

Der folgende Code nicht funktioniert, ich nehme an, weil die Einheimischen() Variable innerhalb des Verstehens auf den verschachtelten Block beziehen, wo Verständnis ausgewertet:mit Einheimischen() innerhalb Wörterbuch Verständnis

def f(): 
    a = 1 
    b = 2 
    list_ = ['a', 'b'] 
    dict_ = {x : locals()[x] for x in list_} 

ich verwenden könnte globals() stattdessen, und es scheint zu funktionieren, aber das kann mit einigen zusätzlichen Problemen kommen (zB wenn es eine Variable von einem umgebenden Bereich gab, der zufällig denselben Namen hat).

Gibt es irgendetwas, das das Wörterbuch mit den Variablen genau im Rahmen der Funktion f machen würde?

Hinweis: Ich mache das, weil ich viele Variablen habe, die ich später in ein Wörterbuch schreiben möchte, aber den Code nicht durch Schreiben dict_['a'] anstelle von a in der Zwischenzeit verkomplizieren möchte.

Antwort

4

Man könnte dies vielleicht tun:

def f(): 
    a = 1 
    b = 2 
    list_ = ['a', 'b'] 
    locals_ = locals() 
    dict_ = dict((x, locals_[x]) for x in list_) 

Allerdings würde ich dringend die Verwendung von locals() für diesen Zweck entmutigen.

+0

ich nicht daran denken haben! Und warum ist es schlecht, Einheimische() so zu benutzen? Ich benutze nichts undokumentiertes, oder? – max

+2

Es ist nicht undokumentiert, aber die Verwendung von 'locals()' kann den Compiler veranlassen, weniger als optimalen Code für die Funktion zu generieren, auf die verwiesen wird. Wenn der Compiler zum Beispiel feststellt, dass er die Verwendung einiger temporärer Variablen (vielleicht eine * andere * Variable in der Funktion, die nicht mit Ihrem Wörterbuch verwandt ist) optimieren kann, kann er dies unter Umständen nicht tun, wenn 'localhosts()' verwendet wird innerhalb der Funktion. Wenn Sie nicht zuerst ein Wörterbuch erstellen, wiederholen Sie sich selbst mit (1) der Zuweisung jeder Variablen und (2) den Namen in der Liste. –

+0

Dann stecke ich fest: http://stackoverflow.com/questions/4067463/alternative-to-locals-in-printing-a-table-with-a-header – max

1

Ich glaube, dass Sie Recht haben: die locals() innerhalb der Diktat Verständnis bezieht sich auf den Namespace des Verständnisses.

Eine mögliche Lösung (wenn es nicht bereits zu Ihnen aufgetreten ist):

f_locals = locals() 
dict_ = {x : f_locals[x] for x in list_}