2014-01-21 26 views
0

所以即时通讯尝试在python中实现选择排序..和即时追加每个迭代的结果到列表打印结束..我的代码正确排序数字列表,但当我将它追加到同一个列表在结束它改变所有其他列表..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的内容变化为这两个列表!

+1

您没有两个列表的列表,您有同一列表的两个副本的列表。既然你已经给了我们一段不运行的代码,并且不会返回你所说的如果修复运行,它很难解释为什么你的实际代码会这样做。 – abarnert

+0

你应该看到python – Vipul

回答

2

使用切片进行复印

newlist = alist[:] 

在你的情况,我想这是:

alist.append(numbers[:]) 
+0

列表中的浅拷贝和深层拷贝的概念,我明白为什么它现在这样做了大声笑..使列表的副本解决了它!谢谢! – 3MIN3M

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() 
+0

ahh忘记列表在python中是可变的:S thnx! – 3MIN3M

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)。

我不知道你为什么预期[3, 7, 5]为第一个元素,但也许你正在做一些其他的工作,你没有告诉我们的第一个元素alist。在这种情况下,只要你以复制而不是变异的方式完成这项工作(ala sorted(n)与)或者复制,一切都会好起来的。

+0

感谢您的解释! – 3MIN3M

+0

现在非常有意义^谢谢 – 3MIN3M