2017-07-03 28 views
0

我正在嘗試爲python創建一個氣泡排序方法,僅僅爲了poops和grins。我不認爲我的交換方法正在工作。Python交換方法不起作用

def bubbleSort(list): 
length = len(list) 
for i in range(length - 1): 
    if list[i] > list[i+1]: 
     #swap 
     swap(list[i], list[i+1]) 
     print(list) 
print(list) 

def swap(s1, s2): 
    # assert type(s1) == list and type(s2) == list 
    # tmp = s1[:] 
    # s1[:] = s2 
    # s2[:] = tmp 
    s2, s1 = s1, s2 

該程序吐出我的列表,但沒有任何改變任何時間告訴我,我的交換方法無法正常工作。

+0

當您執行s2時,s1 = s1,s2'只交換'swap'函數中的局部變量名稱。由於許多python類型是不可變的,所以不能編寫簡單的交換函數。 – pschill

+0

這是Python不支持傳遞引用語義的一個很好的例子。如果是這樣,你可以寫一個交換功能與相同的身體,併產生你想要的結果! –

回答

4

如果傳遞永恆不變的參數,像整數,字符串或元組的功能,傳球的作用就像個call-by-值。對象引用被傳遞給函數參數。它們不能在函數內改變,因爲它們根本不能改變,即它們是不可變的。這是不同的,如果我們傳遞可變參數。它們也通過對象引用傳遞,但它們可以在函數中進行更改。如果我們將一個列表傳遞給一個函數,我們必須考慮兩種情況:一個列表的元素可以被改變,即使在調用者的範圍內列表也會被改變。如果新名單被分配給該名稱,則舊名單不會受到影響,即調用者範圍中的名單將保持不變。

嚴格來說,在你的例子中將列表中的元素傳遞給swap函數,不會有效果。雖然Python語法允許你直接寫這個:

list[i], list[i+1] = list[i+1], list[i] 

不知道什麼是提取這種微小的邏輯到單獨的功能的目的。

PS。要詳細瞭解評估策略,例如按價值劃撥,通過引用來電和爲什麼不同,你可以看看wiki

PPS。正如評論正確地指出,對蟒蛇的共同評價的策略是「Call-by-Sharing」,例如:

呼叫通過共享(也被物體被稱爲呼叫或對象共享調用)是一項評價戰略首次命名Barbara Liskov等人爲1974年語言CLU。[5]它被諸如Python,[6] Iota,[7] Java(用於對象引用),Ruby,JavaScript,Scheme,OCaml,AppleScript等許多語言所使用。但是,「共享呼叫」一詞並不常用;術語在不同來源中不一致。例如,在Java社區中,他們說Java是按價值調用的[8]。通過共享調用意味着語言中的值基於對象而不是基本類型,即所有值都是「裝箱」的。

+1

值得注意的是,Python評估策略的技術名稱(儘管很少使用)是[通過共享調用](https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)。它與Java,Javascript,Ruby和其他許多人共享。 –

+1

我知道它是「按對象呼叫」,而你的觀察仍然正確。 –