python 中 exec 中的赋值
assignment within exec in python
我正在尝试使用 PyQt5 构建计算器,我得到了一个字符串,我需要对其进行评估并将其分配给一个变量,以便我可以将该变量作为答案传递给小部件。到目前为止,我可以评估表达式但不能评估它。我怎样才能做到这一点 ?到目前为止,我有以下代码:-
# this functions gets called when Enter is pressed
def etrp(self):
eqn = self.sender().text() #I get string like '23+4'
eqn1 = "{0} = {1}".format("global x",eqn) #I make it x = 23+4
x = 0
exec(eqn1) # I get error here
print(x)
#some code .....
当我尝试 运行 它没有全局时,它 运行s 没有错误但是 x 仍然是 0 如果我 运行 它像这样我得到这个错误:-
qt5ct: using qt5ct plugin
global x = 12+32
Traceback (most recent call last):
File "/home/orayan/Development/Python/Calculator/calculator.py", line 11, in etrp
exec(eqn1)
File "<string>", line 1
global x = 12+32
^
SyntaxError: invalid syntax
[1] 19185 abort (core dumped) ./main.py
我对 python 很陌生,所以不知道发生了什么
global x = 5
无效 python 代码。
如果要赋值给全局变量x
,应该写
global x
x = 5
尝试将您的代码更改为
global x
eqn1 = "{0} = {1}".format("x",eqn)
x = 0
exec(eqn1, globals())
使用exec修改全局变量需要使用globals()函数
编辑:添加 globals() 函数。
嗯,exec
和 eval
是邪恶的。当您在未清理的字符串上使用它们时,您隐含地接受执行几乎任何 Python 表达式...
但是它们的用法并不完全相同:exec
用于执行一些代码,而 eval
将 return 一个值。正确的方法是:
x = eval(eqn)
无论如何,这都不是全局变量的正确用法,因为它仅用于从调用中获取值,因此正确的方法是让函数 return 该值,因此 eval
而不是 exec
.
但请记住:eval
是 邪恶的 所以 永远不要在生产代码中使用它。
关于修改局部变量为什么不起作用的问题,这是明确禁止的。 See this.
我正在尝试使用 PyQt5 构建计算器,我得到了一个字符串,我需要对其进行评估并将其分配给一个变量,以便我可以将该变量作为答案传递给小部件。到目前为止,我可以评估表达式但不能评估它。我怎样才能做到这一点 ?到目前为止,我有以下代码:-
# this functions gets called when Enter is pressed
def etrp(self):
eqn = self.sender().text() #I get string like '23+4'
eqn1 = "{0} = {1}".format("global x",eqn) #I make it x = 23+4
x = 0
exec(eqn1) # I get error here
print(x)
#some code .....
当我尝试 运行 它没有全局时,它 运行s 没有错误但是 x 仍然是 0 如果我 运行 它像这样我得到这个错误:-
qt5ct: using qt5ct plugin
global x = 12+32
Traceback (most recent call last):
File "/home/orayan/Development/Python/Calculator/calculator.py", line 11, in etrp
exec(eqn1)
File "<string>", line 1
global x = 12+32
^
SyntaxError: invalid syntax
[1] 19185 abort (core dumped) ./main.py
我对 python 很陌生,所以不知道发生了什么
global x = 5
无效 python 代码。
如果要赋值给全局变量x
,应该写
global x
x = 5
尝试将您的代码更改为
global x
eqn1 = "{0} = {1}".format("x",eqn)
x = 0
exec(eqn1, globals())
使用exec修改全局变量需要使用globals()函数
编辑:添加 globals() 函数。
嗯,exec
和 eval
是邪恶的。当您在未清理的字符串上使用它们时,您隐含地接受执行几乎任何 Python 表达式...
但是它们的用法并不完全相同:exec
用于执行一些代码,而 eval
将 return 一个值。正确的方法是:
x = eval(eqn)
无论如何,这都不是全局变量的正确用法,因为它仅用于从调用中获取值,因此正确的方法是让函数 return 该值,因此 eval
而不是 exec
.
但请记住:eval
是 邪恶的 所以 永远不要在生产代码中使用它。
关于修改局部变量为什么不起作用的问题,这是明确禁止的。 See this.