我刚刚遇到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)。当我没有使用列表切片时,为什么它返回了错误的值?
答案 0 :(得分:3)
[:]
符号是已知的&#34;句法糖&#34; 重复列表(它不是数组)。
它是一个slice,它占据了整个列表 - 有效地复制了它。
在您的代码中,当您使用ar[:]
表示法时,您没有传递相同的列表 - 您正在传递全新列表(具有相同的成员)。这样,quickSort
递归中的每个框架都有自己的,独占列表(ar
)。
当您按原样传递原始列表时,这不会发生 - 这是可变的。让两个(或更多......)帧修改同一个列表会造成破坏。