Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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
Python 多次定义函数_Python - Fatal编程技术网

Python 多次定义函数

Python 多次定义函数,python,Python,我有一个动态Python服务,它将在每个记录的基础上定义函数,我遇到了一些我不太清楚的问题。假设我有一个这样设置的测试程序: func_str = """ def func(): print "top" """ exec func_str func_str = """ def func(): print "bottom" """ exec func_str func() 当然,这将打印“bottom”,因为对exec func_str的第二次调用将覆盖第一次调用。我很好奇引擎盖下发

我有一个动态Python服务,它将在每个记录的基础上定义函数,我遇到了一些我不太清楚的问题。假设我有一个这样设置的测试程序:

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

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

func()

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

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

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

foo = func
因此,您稍后仍可以将其称为
foo

foo()

您也可以将其存储在字典、列表或其他对象的属性中。

与此相同:

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

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

Wow,这项服务听起来很可怕。您确定需要这样执行整个函数吗?如果有任何共同的功能,你应该认真考虑写一个单一的函数,它需要适当的输入或使用类和继承来完成任务,而不使用<代码> Exc> <代码>,如果最终用户可以修改任何输入,这可能是危险的。我知道这听起来很可怕,但这并不是任何被外部/其他用户访问的东西。@Valdogg21这并没有让它变得不那么可怕。