0

我有一个动态的 Python 服务,它将在每条记录的基础上定义函数,但我遇到了一些我无法弄清楚的事情。假设我已经设置了一个测试程序,如下所示:

func_str = """
def func():
  print "top"
"""
exec func_str

func_str = """
def func():
  print "bottom"
"""
exec func_str

func()

这当然会 print "bottom",因为第二次调用会exec func_str覆盖第一次调用。我很好奇引擎盖下会发生什么。是否以某种方式删除了第一个函数定义?

4

2 回答 2

5

编译函数体,然后将其分配给变量 name 下的本地命名空间func

然后,当您运行第二exec条语句时,会以相同的名称存储一个新函数,并覆盖第一个。您可以通过以新名称存储对它的引用来保留第一个:

foo = func

因此您以后仍可以将其称为foo

foo()

您还可以将其存储在字典、列表中或作为另一个对象的属性。

于 2012-09-05T20:14:46.960 回答
2

与此相同:

>>> a = 5
>>> print a
5
>>> a = 'hello'
>>> print a
'hello'

换句话说,它只是将一个函数分配给一个名称(在本例中为func),并在随后的调用中将相同的名称func重新分配给另一个函数。

于 2012-09-05T20:16:24.530 回答