Làm cách nào để chỉ định giá trị của một biến bằng eval trong python?


77

Được chứ. Vì vậy, câu hỏi của tôi rất đơn giản: Làm cách nào để chỉ định giá trị của một biến bằng eval trong Python? Tôi đã thử eval('x = 1')nhưng không được. Nó trả về một SyntaxError. Tại sao điều này sẽ không hoạt động?


1
Bạn đang cố làm gì vậy? Dù bạn đang làm gì, bạn không nên sử dụng eval.
babsher

1
Không đồng ý, đánh giá có rất nhiều công dụng tuyệt vời
Joshua

Câu trả lời:


119

Bởi vì x=1là một câu lệnh, không phải một biểu thức. Sử dụng execđể chạy các câu lệnh.

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

Nhân tiện, có nhiều cách để tránh sử dụng exec/ evalnếu tất cả những gì bạn cần là một tên động để gán, ví dụ: bạn có thể sử dụng từ điển, setattrhàm ,hoặc locals()từ điển:

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

Cập nhật : Mặc dù mã trên hoạt động trong REPL, nhưng nó sẽ không hoạt động bên trong một hàm. Xem Sửa đổi người dân địa phương trong Python để biết một số lựa chọn thay thế nếu bạn execkhông hiểu.


6
Và btw, nếu bạn muốn thay đổi một biến như thế này, bạn có thể muốn một từ điển thay thế.
Ned Batchelder

Có lẽ sẽ sử dụng từ điển vào lần tới khi tôi làm điều gì đó như thế này.
Fox Wilson

4
Tài liệu Python nói rằng bạn không nên sửa đổi locals(). ( docs.python.org/2/library/functions.html#locals ) Có cách nào khác để chỉ sử dụng nhiệm vụ mà không có toàn bộ điều xấu eval()không?
Jason S

14

Bạn không thể, vì phép gán biến là một câu lệnh, không phải là một biểu thức và evalchỉ có thể là các evalbiểu thức. Sử dụng execthay thế.

Tốt hơn hết, đừng sử dụng và hãy cho chúng tôi biết bạn đang thực sự cố gắng làm gì để chúng tôi có thể đưa ra giải pháp an toàn và lành mạnh.


0
x = 0
def mateNewValueToX (v):
    toàn cầu x
    x = v

eval ('gánNewValueToX (1)')
print (x)

Nó hoạt động ... vì python thực sự sẽ chạy lệnh giaoNewValueToX để có thể đánh giá biểu thức. Nó có thể được phát triển thêm, nhưng tôi chắc chắn rằng có một lựa chọn tốt hơn cho hầu hết mọi nhu cầu mà một người có thể có.


Gần như, nhưng tôi cần phải gán động tên biến. Xin cảm ơn.
Fox Wilson

0

Bạn thực sự có thể đặt exec()lệnh bên trongeval()

Vì vậy, tuyên bố của bạn sẽ giống như eval("exec('x = 1')")

ps cái này nguy hiểm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.