Як я можу призначити значення змінної за допомогою eval у python?


77

Добре. Отже, моє запитання просте: як я можу призначити значення змінної за допомогою eval у Python? Я намагався, eval('x = 1')але це не спрацює. Він повертає SyntaxError. Чому це не спрацює?


1
Що ти намагаєшся робити? Що б ви не робили, ви не повинні використовувати eval.
babsher

1
Погодьтеся, eval має безліч чудових застосувань
Джошуа

Відповіді:


119

Тому що x=1це твердження, а не вираз. Використовуйте execдля запуску операторів.

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

До речі, існує безліч способів уникнути використання exec/ evalякщо все, що вам потрібно, це динамічне ім'я для присвоєння, наприклад, ви можете використовувати словник, setattrфункцію ,або locals()словник:

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

Оновлення : Хоча наведений вище код працює в REPL, він не буде працювати всередині функції. Дивіться Модифікація місцевих жителів у Python, щоб execдізнатися про інші варіанти, якщо мова не йде про це.


6
До речі, якщо ви хочете змінити таку змінну, напевно, вам потрібен словник.
Ned Batchelder,

Можливо, наступного разу, коли я буду робити щось подібне, буду користуватися словником.
Фокс Вілсон,

4
Документи Python говорять, що ви не повинні модифікувати locals(). ( docs.python.org/2/library/functions.html#locals ) Чи існує інший спосіб просто використовувати призначення без повного зла eval()?
Jason S

14

Ви не можете, оскільки присвоєння змінної - це вираз, а не вираз, і evalможе лише evalвирази. Використовуйте execзамість цього.

А ще краще, не використовуйте ні те, ні інше, і повідомте нам, що ви насправді намагаєтесь зробити, щоб ми могли знайти безпечне та здорове рішення.


0
x = 0
def assignNewValueToX (v):
    глобальний х
    x = v

eval ('assignNewValueToX (1)')
друк (x)

Це працює ... тому що python насправді буде запускати assignNewValueToX, щоб мати можливість оцінити вираз. Його можна розвивати і надалі, але я впевнений, що є кращий варіант для будь-яких потреб.


Майже, але мені потрібно динамічно призначати ім'я змінної. Хоча дякую.
Фокс Вілсон,

0

Ви можете фактично помістити exec()команду всерединуeval()

Тож ваше твердження могло б виглядати так eval("exec('x = 1')")

ps це небезпечно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.