Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
exec()在函数python3.x内不工作_Python_Python 3.x_Exec - Fatal编程技术网

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()