如果 Python 不支持方法重载,那么为什么这个方法重载有效而另一个方法不支持?

if Python doesn't support method overloading, then why does this method overload work while this other does not?

如果Python不支持方法重载(除了*args和**kwargs或PEP 3124),那么为什么这个重载有效?

# the sum from 1 to n
def sum(n):
    if n > 0:
        return n + sum(n - 1)
    else:
        return 0

print(sum(3))

# the sum from n to m, inclusive
def sum(n, m):
    if n <= m:
        return n + sum(n + 1, m)
    else:
        return 0

print(sum(3,5))

...虽然更令人费解,但这个不是:

# the sum of elements in an array
def sumArray(A):
    return sumArray(A, len(A)-1)

# a helper for the above
def sumArray(A, i):
    if i < 0:
        return 0
    else:
        return A[i] + sumArray(A, i-1)

print(sumArray([1,2,3]))

您没有超载。通过对不同的对象使用相同的名称,您将一件事隐藏在另一件事之后。尝试

sum = 42

看看 print(sum(3, 5)) 是如何停止工作的。

在你的第一个例子中,你定义了函数并使用它,然后用另一个覆盖它,并使用新的,就像使用常规变量一样:

a = 1
print(a)

a = 2
print(a)

函数定义是变量赋值。他们创建一个函数并将其分配给与您使用的名称匹配的变量。您正在看到重新分配变量的普通效果。

def sum(n):
    ...

这将 1 个参数的函数分配给变量 sum

print(sum(3))

这使用分配给该变量的函数。

def sum(n, m):
    ...

这为变量 sum 分配了一个新函数,替换了第一个函数。

print(sum(3,5))

这个使用了新函数。如果您尝试使用旧功能,您将找不到它。


# the sum of elements in an array
def sumArray(A):
    return sumArray(A, len(A)-1)

# a helper for the above
def sumArray(A, i):
    if i < 0:
        return 0
    else:
        return A[i] + sumArray(A, i-1)

print(sumArray([1,2,3]))

这会将一个函数分配给 sumArray,然后将另一个函数分配给 sumArray,然后尝试使用第一个分配的值。它找到第二个函数,但失败了。