2015-07-20 24 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

相關問題