python列表,在列表中附加内容会改变整个事情吗?

时间:2014-01-21 20:57:07

标签: python list

所以我试图在python中实现选择排序..并且我将每次迭代的结果附加到列表以在末尾打印..我的代码正确地对数字列表进行排序但是当我将它附加到同一列表时最后它改变了所有其他列表..

def s_sort(numbers):
  alist=[]
  #do actual sorting here and swap numbers/index if neccessary

       alist.append(numbers)
  return alist

def main():
    numbers=[5,7,3]
    print(s_sort(numbers))
main()
返回的alist是[[3,5,7],[3,5,7]]而不是[[3,7,5],[3,5,7]] !!!! 不知何故,当我做alist的附加内容时,两个列表的alist更改内容!

3 个答案:

答案 0 :(得分:2)

使用切片制作副本

newlist = alist[:]

在你的情况下,我猜是:

alist.append(numbers[:])

答案 1 :(得分:2)

我没有看到你正在做的实际排序,但总的来说:

列表是可变的。您对其所做的任何更改都会影响该列表的所有链接。要复制它并断开与其他引用的连接,您需要return alist[:]

def s_sort(numbers):
  alist=[]
  #do actual sorting here and swap numbers/index if neccessary

       alist.append(numbers)
  return alist[:]  # this makes it a copy!

def main():
    numbers=[5,7,3]
    print(s_sort(numbers))
main()

答案 2 :(得分:2)

您的代码实际上并没有按照您的说法执行操作。事实上,它甚至没有运行。但是这里有一个简单的例子可以证明你所看到的问题:

def s_sort(numbers):
    alist=[]
    alist.append(numbers)
    numbers.sort()
    alist.append(numbers)
    return alist

问题是alist不是两个不同列表的列表,它是连续两次的相同列表的列表。因此,当您修改一个列表时,当然会在numbersalist[0]alist[1]中显示的位置修改一个列表。

解决方案是不要多次添加相同的列表;相反,添加一个新的。例如:

def s_sort(numbers):
    alist=[]
    alist.append(numbers[:])
    alist.append(sorted(numbers))
    return alist

现在你已经创建了两个全新的列表 - 一个是原始列表的精确副本,一个是已排序的副本 - 并返回了它们的列表。

因此,它不是返回[[3, 5, 7], [3, 5, 7]](并且还将numbers更改为[3, 5, 7]),而是返回[[5, 7, 3], [3, 5, 7]](并单独留下numbers)。< / p>

我不知道你为什么期望[3, 7, 5]第一个元素,但也许你正在为alist的第一个元素做一些你没有告诉我们的工作。在这种情况下,只要你以复制而不是变异的方式(ala sorted(n) vs. n.sort())执行该工作,或者将其复制到副本中,一切都会没问题。