【问题标题】:What is the difference of using arrayName and arrayName[:] in Python? [duplicate]在 Python 中使用 arrayName 和 arrayName[:] 有什么区别? [复制]
【发布时间】:2015-10-10 03:58:22
【问题描述】:

我刚刚遇到了 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)。为什么我不使用列表切片时返回错误的值?

【问题讨论】:

标签: python arrays list python-3.x


【解决方案1】:

[:] 表示法是一种已知的“语法糖”,用于复制列表(它不是数组)。

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

在您的代码中,当您使用ar[:] 表示法时,您传递的不是同一个列表——您传递的是一个全新的列表(具有相同的成员)。这样,quickSort 递归中的每一帧都有其自己的专有列表 (ar)。

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

【讨论】:

  • 注意:它确实复制了列表(并且在修改循环内的列表时特别有用)但是很高兴知道语法 del mylist[:] 确实清空了列表(而不是列表)。
  • @bufh 我没有看到此代码中使用了del,所以这不在问题的范围内。在这种特殊情况下,我们担心的是帧 - 因为quicksort 是一个递归函数。
  • 这不是批评,只是让用户了解[:] 语法。
  • @bufh 很酷,我认为还有一个关于它的热门问题
  • 我知道它是重复的,但是如果我创建一个变量,为什么它仍然会造成破坏?喜欢ar = list(map(int, input().split()))copy1 = arcopy2 = arprint(insertion_sort(copy1) - quickSort(copy2, 0, n))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2014-02-24
  • 2015-05-18
  • 2010-12-10
  • 2016-08-24
  • 2016-02-16
相关资源
最近更新 更多