在Python中使用arrayName和arrayName [:]有什么区别?

时间:2015-07-20 21:16:06

标签: python arrays list python-3.x

我刚刚遇到Python问题,我最终修复了自己。虽然我仍然想知道使用

的区别
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)。当我没有使用列表切片时,为什么它返回了错误的值?

1 个答案:

答案 0 :(得分:3)

[:]符号是已知的&#34;句法糖&#34; 重复列表(它不是数组)。

它是一个slice,它占据了整个列表 - 有效地复制了它。

在您的代码中,当您使用ar[:]表示法时,您没有传递相同的列表 - 您正在传递全新列表(具有相同的成员)。这样,quickSort递归中的每个框架都有自己的独占列表(ar)。

当您按原样传递原始列表时,这不会发生 - 这是可变的。让两个(或更多......)帧修改同一个列表会造成破坏。