在函数内运行Python脚本字符串,返回错误

时间:2017-04-17 05:26:58

标签: python function

Python 中,这可行:

exec('x = 1; y = 2')

所以你成功创建了x和y:

>>> x,y
(1,2)

但这不起作用:

def DoIt():
    exec('x = 1; y = 2')
    return x,y

>>> DoIt()
...
NameError: name 'x' is not defined

为什么呢?任何解决方案?

=============================================== =

修改 非常奇怪和意外: 以上适用于Python 2.7

查看https://repl.it/languages/python

无论如何,我使用的是Python 3.5 64Bit,它根本不起作用! Python 2.7不适合我。

这篇文章要求深入了解经验丰富的Pythonist

  

亲爱的新人,首先,非常欢迎Stackoverflow!而你甚至没有注意到问题的全部内容就开始了你的旅程!你可以做得更好,耐心等待。留下评论,没关系,建议。

     

顺便说一下,对我来说最重要的是我的问题的答案。

[注]

这不是另一个问题的重复。我不得不与Python 2.7做生意,看看有什么区别。在评论和之前(现已删除)的答案后,这里发现了这种奇怪的行为。

因此,当发生类似这样的事情时,如果在以前版本的Python中以不同的方式运行,则不会检查代码。你没有。所以关于这方面的建议是无关紧要的。

1 个答案:

答案 0 :(得分:3)

在Python 2中,exec是一个内置语句,它将变量泄露到周围的范围内。这个范围泄漏在Python 3中得到了修复,其中exec()现在是一个与任何其他函数一样的沼泽标准库函数。 You cannot create or modify local variables of the surrounding function scope within exec()

确实在模块范围内工作,正如您所发现的那样。文档很清楚,它只适用于函数本地范围。

可以做什么,是通过你自己的本地变量字典:

def do_it():
    vars = {}
    exec('x = 1; y = 2', vars)
    return (vars['x'], vars['y'])