我在Java中看到了这个问题的变体,但我无法理解它。为什么在调用函数mergeSort时列表会更改,即使没有显式返回?我无法理解它。递归调用如何返回堆栈中的那些调用?我错过了一些信息来理解代码的内部工作原理,以便在调用alist
时获得mergesort更改mergeSort(alist)
的原因。
以下是link的代码:
def mergeSort(alist):
print("Splitting ",alist)
if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergeSort(lefthalf)
mergeSort(righthalf)
i=0
j=0
k=0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("Merging ",alist)
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
答案 0 :(得分:1)
考虑这个小例子:
def foo(lst):
lst[0] = 1000
lst = [10, 20, 30]
foo(lst)
print(lst) # prints [1000, 20, 30]
它的工作原理是因为列表与任何其他对象一样,通过引用传递。
如果这听起来像你的新东西,你应该重新阅读/任何python手册的介绍部分。
理解这个概念可能是一个很好的阅读:https://www.python-course.eu/passing_arguments.php