所以这是我的快速排序代码
def quicksort(A):
if len(A) > 1:
pivot = A[0]
L = []
E = []
R = []
for i in A:
if i < pivot:
L.append(i)
elif i == pivot:
E.append(i)
else:
R.append(i)
quicksort(L)
quicksort(R)
A = L + E + R
我运行时的输出
array = [5,6,3,2,7]
print "original array" + str(array)
quicksort(array)
print "sorted array" + str(array)
时
original array[5, 6, 3, 2, 7]
sorted array[5, 6, 3, 2, 7]
但是,当我使用调试器逐步执行该函数时,最后一个值A持有的是[2,3,5,6,7],它被排序,为什么在执行该函数后A不能保持这个? / p>
答案 0 :(得分:5)
您构建 new 列表A = L + E + R
,重新绑定本地名称。原始列表不受影响。
您需要返回新的列表对象:
def quicksort(A):
if len(A) > 1:
pivot = A[0]
L = []
E = []
R = []
for i in A:
if i < pivot:
L.append(i)
elif i == pivot:
E.append(i)
else:
R.append(i)
L = quicksort(L)
R = quicksort(R)
return L + E + R
return A
这将返回一个新的列表对象:
>>> quicksort([5,6,3,2,7])
[2, 3, 5, 6, 7]
或者,使用切片分配就地更新列表:
def quicksort(A):
if len(A) > 1:
pivot = A[0]
L = []
E = []
R = []
for i in A:
if i < pivot:
L.append(i)
elif i == pivot:
E.append(i)
else:
R.append(i)
quicksort(L)
quicksort(R)
A[:] = L + E + R
现在原始列表就地改变了:
>>> lst = [5,6,3,2,7]
>>> quicksort(lst)
>>> lst
[2, 3, 5, 6, 7]
答案 1 :(得分:0)
问题是最后一行没有做你认为它做的事情:
A = L + E + R
这将L,E和R一起添加到新列表中,并将该新列表绑定到本地变量A
。它不会影响A
以前以任何方式绑定的列表。
您可能想要做的是替换A
绑定的现有列表的内容。像这样:
A[:] = L + E + R
你问“为什么在执行该功能后A不能保持这个?”好吧,执行该函数后,A
根本不存在。这是局部变量的重点。
当然array
存在。 array
和A
最初是对同一列表的引用。如果你改变那个列表,你会得到你想要的。如果您使A
引用其他列表,则不会。