递归Python快速排序中的变量范围

递归Python快速排序中的变量范围,python,recursion,scope,quicksort,Python,Recursion,Scope,Quicksort,我对Python中的变量作用域有点困惑。我怀疑以下代码由于其可变范围问题而无法工作 def partition(a): #return indext p=a[0] i=1 j=1 while j<len(a): if a[j]<p: a[j],a[i]=a[i],a[j] i+=1 j+=1 a[0],a[i-1]=a[i-1

我对Python中的变量作用域有点困惑。我怀疑以下代码由于其可变范围问题而无法工作

def partition(a):
     #return indext
     p=a[0]
     i=1
     j=1
      while j<len(a):
          if a[j]<p:
              a[j],a[i]=a[i],a[j]
              i+=1
          j+=1
      a[0],a[i-1]=a[i-1],a[0]
      return (i-1,i)

 def qsort(input_array):
      if len(input_array)<=1:
          pass
      else:
          #partition_index[0] is the index of the pivot
          #partition_index[1] is the indext after the pivot
          if len(input_array)==2:
              partition_index=partition(input_array)
          else:
              partition_index=partition(input_array)
              qsort(input_array[:partition_index[0]])
              qsort(input_array[partition_index[1]:])
如果我让qsort返回,它会工作。。。我很困惑。。。。下面是我输入return语句后的代码

 def partition(a):
     #return indext
     p=a[0]
     i=1
     j=1
     while j<len(a):
         if a[j]<p:
             a[j],a[i]=a[i],a[j]
             i+=1
         j+=1
     a[0],a[i-1]=a[i-1],a[0]
     return (i-1,i)


 def qsort(input_array):
     if len(input_array)<=1:
         pass
     else:
         #partition_index[0] is the index of the pivot
         #partition_index[1] is the indext after the pivot
         if len(input_array)==2:
             partition_index=partition(input_array)
         else:
             partition_index=partition(input_array)
             input_array[:partition_index[0]]=qsort(input_array[:partition_index[0]])
             input_array[partition_index[1]:]=qsort(input_array[partition_index[1]:])
     return input_array
def分区(a):
#返回索引
p=a[0]
i=1
j=1
虽然j
快速排序(input_array[:partition_index[0]])
实际上并不在数组的第一个分区上调用快速排序,但它在数组的第一个分区的副本上调用快速排序。因此,您的代码在适当的位置对数组进行分区,然后创建半个数组的副本并尝试对它们进行排序(但从未对生成的数组执行任何操作),因此递归调用没有任何效果

如果您想这样做,您必须避免使用切片复制列表,而是传递整个列表以及您希望函数应用到的范围

 def partition(a):
     #return indext
     p=a[0]
     i=1
     j=1
     while j<len(a):
         if a[j]<p:
             a[j],a[i]=a[i],a[j]
             i+=1
         j+=1
     a[0],a[i-1]=a[i-1],a[0]
     return (i-1,i)


 def qsort(input_array):
     if len(input_array)<=1:
         pass
     else:
         #partition_index[0] is the index of the pivot
         #partition_index[1] is the indext after the pivot
         if len(input_array)==2:
             partition_index=partition(input_array)
         else:
             partition_index=partition(input_array)
             input_array[:partition_index[0]]=qsort(input_array[:partition_index[0]])
             input_array[partition_index[1]:]=qsort(input_array[partition_index[1]:])
     return input_array