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

2024-03-29 09:18:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在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)

Tags: 对象rightloreturnifdefhisort
2条回答

这似乎是一个错误:

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

Partition函数有逻辑问题。 如果使用调试器跟踪它,您将看到它总是在返回之前将数组恢复到其初始状态。实际上,数组会被视为已修改,问题是在对它进行一段时间的修改之后,它会恢复到进入函数时的状态。你知道吗

你使用调试工具吗?如果没有,现在就开始。 如果是这样,请在return j语句上放置一个断点,并检查数组,您将了解我的意思。你知道吗

您正在尝试实现Hoare分区,对吗? 我想你有点搞混了。这个问题是因为在第一次循环迭代之前,您正在与pivot进行比较,最后您将再次比较刚刚交换的元素。你知道吗

相关问题 更多 >