【问题标题】:assignment within exec in pythonpython中exec内的赋值
【发布时间】:2018-10-27 16:31:21
【问题描述】:

我正在尝试使用 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 .....

当我尝试在没有全局的情况下运行它时,它运行时没有错误,但 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很陌生所以不知道发生了什么

【问题讨论】:

  • 1.请向我们展示更多的追溯。 2. 如果您是 Python 新手,请考虑在使用 PyQt5 之前先熟悉该语言。 3. 不要使用全局变量。
  • @Coal_ 1. 我添加了完整的输出 .2。我同意 但是我非常熟悉 C++ 中的 Qt ..

标签: python variable-assignment python-exec


【解决方案1】:
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() 函数。

【讨论】:

  • X 的值现在是 0
【解决方案2】:

嗯,execeval 是邪恶的。当您在未过滤的字符串上使用它们时,您隐含地接受执行几乎任何 Python 表达式...

但它们的用法并不完全相同:exec 用于执行一些代码,而eval 将返回一个值。这里正确的方法是:

x = eval(eqn)

无论如何,这不是全局变量的正确用法,因为它仅用于从调用中获取值,因此正确的方法是让函数返回值,因此eval 而不是exec .

但请记住:eval邪恶的,所以永远不要在生产代码中使用它

【讨论】:

    【解决方案3】:

    关于为什么在尝试修改局部变量时它不起作用的问题,这是明确禁止的。 See this.

    【讨论】:

    • 请不要只发布网址。
    • @mate00 我觉得有道理。我完全解释了问题出现的地方(在 OP 给出的第一种情况下)并给出了参考。解释简短的事实不是嘲笑它的理由。我注意到 StackExch 喜欢人们在处理相同问题时指向 StExch 中的其他帖子,所以我这样做了。谁能要求更多?
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多