Python QuickSort返回原始输入

时间:2014-01-19 21:40:36

标签: python sorting

所以这是我的快速排序代码

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>

2 个答案:

答案 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存在。 arrayA最初是对同一列表的引用。如果你改变那个列表,你会得到你想要的。如果您使A引用其他列表,则不会。