Python:函数不更改数组中的元素

时间:2015-08-29 22:00:10

标签: python variables

我知道在Python中,通过给出对​​象引用的副本来传递变量。但我不明白为什么在我写的下面一段代码中,函数Partition不会改变arr的元素。

def Partition(arr, lo, hi):
    pivot = arr[lo]
    i = lo
    j = hi
    while(True):
        while(arr[i] < pivot): 
            i += 1
            if i == hi: break
        while(arr[j] > pivot): 
            j -= 1
            if j == lo: break

        if i >= j : break       #check if ptrs cross

        arr[i], arr[j] = arr[j], arr[i]
    #swap lo and j
    arr[lo], arr[j] = arr[j], arr[lo]
    return j

def Sort(arr, start, end):
   if (end <= start): return
   right = Partition(arr, start, end)
   Sort(arr, start, right-1)
   Sort(arr, right+1, end)

2 个答案:

答案 0 :(得分:0)

这似乎是一个错误:

Assume arr = [1,3,4,7,5,8], lo=3, hi=6
def Partition(arr, lo, hi):
    pivot = arr[lo]  <- this is arr[3] = 7   
    i = lo           <- i = 3 
    j = hi
    while(True):
        while(arr[i] < pivot): <- arr[3] = 7 so condition fails hence no swap

答案 1 :(得分:0)

您的Partition函数存在逻辑问题。 如果您使用调试器跟随它,您将看到它总是在返回之前将数组恢复到其初始状态。该数组实际上会被视为已修改,问题是在摆弄它一段时间后,它会回到进入函数时的确切状态。

您使用调试工具吗?如果没有,请立即开始这样做。 如果是这样,在return j语句上放置一个断点,并检查数组,你会看到我的意思。

您正在尝试实施 Hoare 分区,对吧? 我觉得你有些混乱了。问题是因为您在第一次循环迭代之前与枢轴进行比较,最终会比较刚刚重新交换的元素。