为什么在python3中运行exec内部函数失败?

为什么在python3中运行exec内部函数失败?,python,python-3.x,Python,Python 3.x,运行python3代码的结果: ------- input option 1 - exec code is executed -------- 0 - for running inside function, 1 - for running in main programa: 1 option = 1 10 ------- input option 0 - exec code not executed inside function ---- 0 - for running inside fu

运行python3代码的结果:

------- input option 1 - exec code is executed --------
0 - for running inside function, 1 - for running in main programa: 1
option = 1
10

------- input option 0 - exec code not executed inside function ----
0 - for running inside function, 1 - for running in main programa: 0
option = 0
code inside execfunction => A = 10
Traceback (most recent call last):
  File "myexec.py", line 19, in <module>
    print(A)    
NameError: name 'A' is not defined
---------------------Code --------------------------

是因为exec在Python3中是一个函数,而在Python2中是一个语句吗?

Python编译器将在遇到print语句时加载GLOBAL,其中它作为未定义的变量“A”失败。如果您尝试反汇编代码[import dis],您将看到后端进程调用的执行情况

本文给出了一个很好且定义明确的解释

如果您确实希望
execfunction
在全局范围内执行函数,您可以这样做

def execfunction(code):
    exec(code, globals())
然后,这将使对
execfunction
的调用在全局范围内执行,而不是仅在函数的局部范围内执行


仅供参考:

代码没有“失败”。如果代码在函数中执行,则变量的作用域不同。将打印移动到函数内部,您将看到。@MikeScotty这就是我所想的,
A
是函数
execfunction()
的一个局部变量,但我尝试了
print(A)
,但它仍然不起作用,非常奇怪。idk为什么。我这样做了,但仍然没有工作:#myexec.py def execfunction(icode):print('code-inside execfunction=>%s%%(icode))exec(icode)print(A)option=int(input)('0-用于运行内部函数,1-用于运行主程序A:))print('option=%d%%(option))code='A=10'if(option==1):exec(code)打印(A)其他:execfunction(代码)对不起,我不知道如何在这个工具中升级我的代码。不,在这种情况下这无关紧要。这仅在将exec本身作为函数传递时才起作用。例如,
map(exec,[“a=1”、“b+=2”、“c=3”])
可以在Python 3中工作,但在Python 2中失败。他的问题与范围界定有关。感谢您的关注!我读了讨论。如果想让代码易于理解,建议的解决方法太复杂了。Edward,谢谢,对了,范围界定。也许在这种情况下应该保持与python3的兼容性。谢谢你的链接!我已经阅读了链接,对于一件简单的事情来说,它似乎太复杂了
def execfunction(code):
    exec(code, globals())