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

python中的函数名相同,没有错误?,python,function,nested,overloading,overriding,Python,Function,Nested,Overloading,Overriding,老实说,我期待着出现某种错误,比如“不能在同一个主体中重命名两个同名的嵌套函数”,我们可以在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]:

老实说,我期待着出现某种错误,比如“不能在同一个主体中重命名两个同名的嵌套函数”,我们可以在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

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

最后一个函数重写了其他函数。。。所以,没有错误!:

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

a = 1
a = 2
同样,您可以这样做:

def f():
    return 1
def f():
    return 2
在这两种情况下,最后指定的值都会覆盖以前的任何值。最后一个赢了

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

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

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


对于函数,这将不起作用,因此我相信您会被这种行为所困扰。

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


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

需要澄清的是,第二个嵌套的add覆盖第一个,但外部的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!

不,相同名称的最后一个函数定义将覆盖/覆盖上述所有定义summ,你确定我认为它重载了吗?pythonRules中不支持not OVERRINGOVERLOADING重载。指定重载函数必须因arity或数据类型而不同,因为函数定义中没有参数类型。。没有超载,看看这个。。。。