0

老实说,我期待某种错误,比如“你不能像这样在同一个主体中重命名两个同名的嵌套函数”,我们可以在 python 中定义任意数量的同名函数吗?

In [40]: def add(i,j):
   ....:     def add(i,j):
   ....:         print i+j
   ....:     def add(i,j):    
   ....:         print i-j
   ....:     return add(i,j)
   ....: 

In [41]: add(5,4)
1

这是函数的重载,还是函数的覆盖??

4

5 回答 5

4

定义一个函数就像给一个变量赋值一样。您可以在 Python 中执行此操作:

a = 1
a = 2

同样,您可以这样做:

def f():
    return 1
def f():
    return 2

在这两种情况下,最后指定的值都会覆盖之前的任何值。所以最后一个赢了。

它是一个嵌套函数的事实与这个问题无关。这同样适用于任何情况。

于 2012-07-18T05:30:03.760 回答
4

当然。语句在def功能上是(函数对名称的)赋值,您可以对同一个名称进行任意数量的赋值。(重要的是要意识到函数定义是在 Python 中执行的,它们不是在编译时静态评估的。)

有一些在类定义中捕捉到这一点的 hacky 方法,比如我在 5 月发布的这个方法。如果您使用的是 Python 3,则有更好的方法

对于函数,这不起作用,所以我相信你会被这种行为困扰。

于 2012-07-18T05:33:27.767 回答
0

最后一个函数覆盖了其他函数......所以,没有错误!:)

于 2012-07-18T05:29:39.273 回答
0

函数定义在当前符号表中引入函数名称。函数名称的值具有被解释器识别为用户定义函数的类型。然后可以将此值分配给另一个名称,甚至可以通过重新定义函数来重新分配。

在重新定义函数的情况下,将使用最新的定义,因为它是解释器识别的。

于 2012-07-18T06:04:46.153 回答
0

为了清楚起见,第二个嵌套add()覆盖了第一个,但外部的保持不变。

这是一个最小的例子:

def do_sth(s):
    def do_sth(s):
        print('Hello, %s!' % s)
    print('Ola')
    do_sth(s)

>>> do_sth('chuinul')
Ola
Hello, chuinul!
>>> do_sth('chuinul')
Ola
Hello, chuinul!

当您do_sth()第二次调用时,这仍然是您定义的正在调用的外部函数。否则,您将只有:

>>> do_sth('chuinul')
Hello, chuinul!
于 2017-02-10T15:57:55.063 回答