我有一个动态的Python服务,它将在每个记录的基础上定义函数,我遇到了一些我无法弄清楚的东西。假设我有一个如此设置的测试程序:
func_str = """
def func():
print "top"
"""
exec func_str
func_str = """
def func():
print "bottom"
"""
exec func_str
func()
当然,这将打印"bottom"
,因为第二次调用exec func_str
会覆盖第一个。我好奇发生了什么事。是否以某种方式删除了第一个函数定义?
答案 0 :(得分:5)
编译函数体,然后将其分配给变量名func
下的本地名称空间。
然后,当您运行第二个exec
语句时,新函数将以相同的名称存储,覆盖第一个。您可以通过以新名称存储对它的引用来保留第一个:
foo = func
因此您稍后可以将其称为foo
:
foo()
您还可以将其存储在字典,列表或另一个对象的属性中。
答案 1 :(得分:2)
与此相同:
>>> a = 5
>>> print a
5
>>> a = 'hello'
>>> print a
'hello'
换句话说,它只是将一个函数分配给一个名称(在本例中为 func ),并在随后的调用中将同名 func 重新分配给另一个函数