如果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
看看CCD_ 1是如何停止工作的。
函数定义是变量赋值。他们创建一个函数,并将其分配给与您使用的名称匹配的变量。您看到了重新分配变量的普通效果。
def sum(n):
...
这将为变量sum
分配一个参数为1的函数。
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
分配一个不同的函数,然后尝试使用第一次分配的值。它找到了第二个函数,但失败了。
在第一个例子中,定义函数并使用它,然后用另一个函数覆盖它,并使用新的函数,就像使用常规变量一样:
a = 1
print(a)
a = 2
print(a)