Wie kann ich den Wert einer Variablen mit eval in Python zuweisen?

76

In Ordnung. Meine Frage ist also einfach: Wie kann ich den Wert einer Variablen mit eval in Python zuweisen? Ich habe es versucht, eval('x = 1')aber das wird nicht funktionieren. Es gibt einen SyntaxError zurück. Warum funktioniert das nicht?

Fox Wilson
quelle
1
Was versuchst du zu machen? Was auch immer Sie tun, Sie sollten eval nicht verwenden.
Babsher
1
Nicht einverstanden, eval hat jede Menge großartige Verwendungsmöglichkeiten
Joshua

Antworten:

118

Weil x=1es eine Aussage ist, kein Ausdruck. Verwenden Sie execdiese Option , um Anweisungen auszuführen.

>>> exec('x=1')
>>> x
1

Übrigens gibt es viele Möglichkeiten, die Verwendung von exec/ zu vermeiden, evalwenn Sie lediglich einen dynamischen Namen zum Zuweisen benötigen, z. B. ein Wörterbuch, die setattrFunktion ,oder das locals()Wörterbuch::

>>> locals()['y'] = 1
>>> y
1

Update : Obwohl der obige Code in der REPL funktioniert, funktioniert er nicht in einer Funktion. Unter Ändern von Einheimischen in Python finden Sie einige Alternativen, wenn dies execnicht in Frage kommt.

kennytm
quelle
6
Übrigens, wenn Sie eine Variable wie diese ändern möchten, möchten Sie wahrscheinlich stattdessen ein Wörterbuch.
Ned Batchelder
Ich werde wahrscheinlich das nächste Mal ein Wörterbuch verwenden, wenn ich so etwas mache.
Fox Wilson
4
Python-Dokumente sagen, dass Sie nicht ändern sollten locals(). ( docs.python.org/2/library/functions.html#locals ) Gibt es eine andere Möglichkeit, die Zuweisung nur ohne das volle Übel von zu verwenden eval()?
Jason S
14

Sie können nicht, da die Variablenzuweisung eine Anweisung ist, kein Ausdruck und evalnur evalAusdrücke. Verwenden Sie execstattdessen.

Besser noch, verwenden Sie es auch nicht und sagen Sie uns, was Sie wirklich versuchen, damit wir eine sichere und vernünftige Lösung finden können.

Rafe Kettler
quelle
0
x = 0
def assignNewValueToX (v):
    global x
    x = v

eval ('assignNewValueToX (1)')
print (x)

Es funktioniert ... weil Python tatsächlich assignNewValueToX ausführt, um den Ausdruck auswerten zu können. Es kann weiterentwickelt werden, aber ich bin sicher, dass es für fast alle Bedürfnisse eine bessere Option gibt.

Sanyi
quelle
Fast, aber ich muss den Variablennamen dynamisch zuweisen. Trotzdem danke.
Fox Wilson
0

Sie können tatsächlich einen exec()Befehl eingebeneval()

Ihre Aussage würde also so aussehen eval("exec('x = 1')")

ps das ist gefährlich

Domchix
quelle