exec()在函数python3.x内不工作
我试图运行此代码,但似乎exec()在函数python3.x内不工作,python,python-3.x,exec,Python,Python 3.x,Exec,我试图运行此代码,但似乎exec()没有执行函数中的字符串: def abc(xyz): for i in fn_lst: s = 'temp=' + i + '(xyz)' exec(s) print (temp) abc('avdfbafadnf') def test(): exec( 'a = 3', globals(), locals() ) print(a) test() 我收到的错误是: NameError
exec()
没有执行函数中的字符串:
def abc(xyz):
for i in fn_lst:
s = 'temp=' + i + '(xyz)'
exec(s)
print (temp)
abc('avdfbafadnf')
def test():
exec( 'a = 3', globals(), locals() )
print(a)
test()
我收到的错误是:
NameError Traceback (most recent call last)
<ipython-input-23-099995c31c78> in <module>()
----> 1 abc('avdfbafadnf')
<ipython-input-21-80dc547cb34f> in abc(xyz)
4 s = 'temp=' + i + '(word)'
5 exec(s)
----> 6 print (temp)
NameError: name 'temp' is not defined
namererror回溯(最近一次调用)
在()
---->1 abc('avdfbafadnf')
在abc(xyz)中
4 s='temp='+i+'(单词)'
5名行政总裁
---->6打印(临时)
NameError:未定义名称“temp”
fn_lst
是一个函数名列表,即:['has_at','has_num'…]
在这种情况下,如果可能,请告诉我
exec()
的替代方法。不要将exec
与函数名一起使用,只需将函数对象保留在列表中:
fn_lst = [has_at, has_num, ...]
并直接执行呼叫:
要使传递给exec()的字符串设置的变量在调用外部可用,请使用exec()如下所示:
exec( a_string, globals(), locals() )
比如说,
exec( 'a = 3', globals(), locals() )
print( a )
将打印以下结果:
3
注意:在本例中,仅使用locals()就足够了,即省略globals()。这里包括这两种情况是为了说明更一般的情况。使用locals()和/或globals()是更大主题的一部分,称为“范围”。您可以在上了解更多信息,我没有足够的信誉点来添加评论,但我想指出,DrM之前的回答不起作用(在函数内部): 此代码在Python 3中给出了一个错误:
NameError: name 'a' is not defined
我尝试了一些使用其他论坛中建议的compile
函数的方法,但它们对我仍然不起作用(至少对于我提到的选项)
根据我的研究,这是我见过的最接近实际工作的代码:
def test():
lcls = locals()
exec( 'a = 3', globals(), lcls )
a = lcls["a"]
print(f'a is {a}')
test()
它成功地打印:
a is 3
总的来说,我认为这是一个重要的话题。有时,当您使用符号代数库(如Symphy)时,通过exec
函数定义变量对于科学计算非常方便
我希望有人知道这个问题的好答案。在花了这么多时间对这个问题进行了点击和试用之后,我可以说像这样使用exec在函数内部没有任何问题,否则它会出错。 我已经对函数和变量进行了测试
def main():
x = "def y():\n\treturn('This will work')"
#pass only globals() not locals()
exec(x,globals())
print(y())
main()
def test():
#pass only globals() not locals()
exec( 'a = 3', globals())
print(a)
test()
这是一个正在使用的屏幕截图(你可以自己复制/粘贴并在这里测试)
回答得好,但请提供一些基本的解释!另外,我认为这里只需要
globals()
,而不需要locals()
,奇怪的是,有人投票否决了这个,没有解释。因为我几乎每天都在毫无问题地运行这段代码。我想知道有人遇到了什么问题。正确的答案是在参数列表中包含locals()和/或globals(),这样结果将是exec()调用之外的作用域的一部分。请参阅我的答案,了解如何执行此操作的示例。它不起作用,因为locals()
是作为dict
的局部变量的副本,而不是它们的真实视图(修改会影响实际的局部变量)。它不能成为视图的原因是,函数局部变量实际上在编译时分配给一个固定大小的局部变量数组(变量的名称甚至不在回溯之外使用,编译器将转换为与名称相关联的索引)。理论上,exec
可以修改现有的局部变量,但它肯定不能创建新的局部变量。有趣的是,这也解释了为什么我的代码神秘地工作。谢谢你的反馈。我确实在函数中以某种形式使用了它,感谢@ShadowRanger的澄清。这是非常有帮助的。这里的最佳答案,非常有效!
def main():
x = "def y():\n\treturn('This will work')"
#pass only globals() not locals()
exec(x,globals())
print(y())
main()
def test():
#pass only globals() not locals()
exec( 'a = 3', globals())
print(a)
test()