Hea*_*rab 5 python recursion exec
我想执行一些Python代码,在运行时输入,所以我得到字符串并调用
exec(pp,globals(),locals())
其中pp是字符串.除了递归调用之外,它工作正常,例如,这段代码没问题:
def horse():
robot.step()
robot.step()
robot.turn(-1)
robot.step()
while True:
horse()
Run Code Online (Sandbox Code Playgroud)
但这个不是:
def horse():
robot.step()
robot.step()
robot.turn(-1)
robot.step()
horse()
horse()
Run Code Online (Sandbox Code Playgroud)
NameError:未定义全局名称"horse"
有没有办法运行递归代码?
UPDATE
a = """\
def rec(n):
if n > 10:
return
print n
return rec(n+1)
rec(5)"""
exec(a)
Run Code Online (Sandbox Code Playgroud)
如果放在顶层,可以工作.但如果在函数内部移动:
def fn1():
a = """\
def rec(n):
if n > 10:
return
print n
return rec(n+1)
rec(5)"""
exec(a)
fn1()
Run Code Online (Sandbox Code Playgroud)
发生相同的错误:NameError:未定义全局名称'rec'
起初这也让我感到惊讶,这似乎是一个奇怪的极端情况,其中 exec 的行为既不像顶级定义,也不像封闭函数中的定义。看起来正在发生的事情是函数定义正在您传入的 locals() dict 中执行。但是,定义的函数实际上并没有访问这个 locals dict 的权限。
通常,如果在顶层定义函数,局部变量和全局变量是相同的,因此函数在内部可见,因为它们可以在全局变量中看到函数。
当一个函数在另一个函数的作用域内定义时,python 会注意到它在函数内被访问,并创建一个闭包,以便“马”映射到外部作用域中的绑定。
在这里,这是一个奇怪的中途案例。exec 就像定义在顶级一样,所以没有创建闭包。但是,由于 locals 与 globals 不同,因此定义不会去函数可以访问它的地方 - 它仅在无法访问的外部 locals 字典中定义。
您可以做以下几件事:
exec s in locals(),locals()”(或者更好,只需使用您自己的字典)。仅提供 globals() dict 具有相同的效果 - 即“ exec s in mydict”#将 func 放在它自己的函数中,这样就创建了一个闭包。例如
s="""
def go():
def factorial(x):
if x==0: return 1
return x*factorial(x-1)
print factorial(10)
go()"""
Run Code Online (Sandbox Code Playgroud)正如stephan 的回答所建议的那样,通过放置“全局 funcname”指令来强制函数进入 globals() 而不是 locals
这个对我有用:
a = """\
def rec(n):
if n > 10:
return
print n
return rec(n+1)
rec(5)"""
exec(a)
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
我只能说您的代码中可能存在错误。
编辑
干得好
def fn1():
glob = {}
a = """\
def rec(n):
if n > 10:
return
print n
return rec(n+1)
rec(5)"""
exec(a, glob)
fn1()
Run Code Online (Sandbox Code Playgroud)