2014-01-21 24 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