python中的递归函数看起来超出了范围,但事实并非如此。我错过了什么?



我试图弄清楚以下代码是如何工作的,

def mergeSort(a):
if len(a) > 1:
mid = len(a)//2
left = a[:mid]
right = a[mid:]
mergeSort(left)
mergeSort(right)
i = j = k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
a[k] = left[i]
i += 1
else:
a[k] = right[j]
j += 1
k += 1
while i < len(left):
a[k] = left[i]
i += 1
k += 1
while j < len(right):
a[k] = right[j]
j += 1
k += 1
return a

在Python教程中,当我注意到while循环处理上一次调用中的"A"列表时。对我来说,这看起来超出了范围,但显然不是。

你能告诉我我缺少了什么吗?我认为它正在替换超出范围的列表元素?

没有这样的"行为超出范围";。python的规则保证变量只有在作用域中时才能修改。

但是,有时多个变量引用同一个对象。在函数的情况下,通过引用传递经常会发生这种情况。这里有一个例子:

def change_element(a):
a[1] = 42
x = list(range(10)
print(x)
change_element(x)
print(x)

在这里,您将看到x的元素发生了更改,因为列表是通过引用传递给change_element()的。这意味着xa都引用相同的列表对象。

你的例子实际上就是这样的。

相关内容

最新更新