编辑:此问题上面的链接没有回答一个mod添加了。正如我之前在评论中所说,Python 3带来了变化,这些答案中给出的examples是针对Python 2.如果我在Python 3环境中编译它们,我会得到与此处相同的错误。
考虑
str = "x = [113, 223]"
exec(str)
print(x[0]) #113
这完美无缺。但是,如果我希望在函数中执行此代码,则会返回错误NameError: name 'x' is not defined
。这是一个最小的工作示例:
def some_code():
str = "x = [1, 2]"
exec(str)
print(x)
some_code()
这里发生了什么?
我需要一个解决方案
在函数内部使用exec(因为它最终是一个tkinter函数 - 请看这个问题的第一个编辑历史 - 我从一个应该执行的文件中读取它
我想很容易地引用x,因为我需要在很多地方做到这一点。因此,使用一长串代码来引用x会很麻烦。
答案 0 :(得分:1)
天真地将相关代码移动到第一级范围解决了它。
string = "x = [113, 223]"
exec(string)
def some_code():
print(x[0]) #113
另一种方法:我开始使用exec()
以及我可以看到exec()
将其结果(在本例中为x
)写入locals()
和globals()
内置词典。因此,以下是该问题的另一种解决方案,但它似乎相当hacky:
def some_code():
string = "x = [113, 223]"
exec(string)
print(locals()['x'][0]) #113
some_code()
以同样的方式,您可以定义自己的字典,而不是locals()
,其中exec()
存储x
,我觉得更清洁:
exec_results = {}
def some_code():
string = "x = [113, 223]"
exec(string, None, exec_results)
print(exec_results['x'][0]) #113
some_code()
我强烈反对将exec()
用于此类非常简单的案例,但如果您希望将来使用它,我强烈建议您查看在此问题之前创建的同一主题的其他主题,例如running-exec-inside-function和globals and locals in python exec()。查看exec()
上的Python docs,了解有关exec()
的更多信息。