2015-07-20 58 views
2

我刚刚遇到了一个Python问题,我最终修复了自己。虽然我仍然不知道有什么用在Python中使用arrayName和arrayName [:]有什么区别?

arrayName 

arrayName[:] 

即使他们有相同的价值观的差异。这里是我的代码,我有问题:

def quickSort(ar, start, end): 
    count = 0 
    if end - start >= 2: 
     p = ar[end-1] 
     pos = start 
     for i in range(start, end-1): 
      if ar[i] < p: 
       if i != pos: 
        ar[i], ar[pos] = ar[pos], ar[i] 
       pos += 1 
       count += 1 
     ar[pos], ar[end-1] = ar[end-1], ar[pos] 
     count += 1 
     count += quickSort(ar, start, pos) 
     count += quickSort(ar, pos+1, end) 
    return count 

def insertion_sort(ar): 
    shift = 0 
    for i in range(1, len(ar)): 
     j = i-1 
     key = ar[i] 
     while (j > -1) and (ar[j] > key): 
      ar[j+1] = ar[j] 
      shift += 1 
      j -= 1 
     ar[j+1] = key 
    return shift 

n = int(input()) 
ar = list(map(int, input().split())) 
print(insertion_sort(ar) - quickSort(ar, 0, n)) 

上面会打印-18,但如果我改变的最后一行到

print(insertion_sort(ar[:]) - quickSort(ar[:], 0, n)) 

将打印1这是insertion_sort正确(返回值()是9,quickSort()的返回值是8)。为什么当我没有使用列表切片时它返回一个错误的值?

+0

请参阅http://stackoverflow.com/q/2612802/3001761 – jonrsharpe

回答

3

[:]表示法是已知的“语法糖”重复列表(它不是数组)。

这是一个slice这需要整个列表 - 有效地复制它。

在您的代码中,当您使用ar[:]表示法时,您没有通过相同的列表 - 您正在传递全新列表(使用相同的成员)。这种方式在quickSort递归每一帧都有它自己的独家列表(ar)。

当你通过原来的列表,这是不会发生 - 这是可变的。让两个(或更多...)帧修改相同的列表会导致混乱。

+0

注意:它确实复制了列表(并且在修改循环中的列表时特别有用),但是知道语法'del mylist [ :]'清空列表(而不是列表的副本)。 – bufh

+0

@bufh我没有在代码中看到'del',所以这不在问题的范围之内。在这个特殊情况下,它是我们担心的框架 - 因为'quicksort'是一个递归函数。 –

+0

这不是一个批评者,只是让用户知道'[:]'语法。 – bufh

相关问题