在python中相同的函数名,没有错误吗?

Same function names in python , No error?

老实说,我一直在期待一些错误,比如"你不能在同一个主体中重命名两个同名的嵌套函数",我们能在python中定义任意数量的同名函数吗?

1
2
3
4
5
6
7
8
9
10
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

这是函数重载还是函数重写??


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

在类定义中有很多方法可以捕捉到这一点,比如我在5月份发布的这个方法。如果您使用的是python 3,那么有更好的方法。

对于函数来说,这是行不通的,所以我相信你会被这种行为所困扰。


定义函数就像给变量赋值一样。在python中可以这样做:

1
2
a = 1
a = 2

同样,您也可以这样做:

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

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

它是一个嵌套函数的事实与这个问题没有关系。这同样适用于任何上下文。


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

下面是一个最小的例子:

1
2
3
4
5
6
7
8
9
10
11
12
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()时,这仍然是您定义的正在被调用的外部函数。否则,您只能:

1
2
>>> do_sth('chuinul')
Hello, chuinul!

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

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


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