03 7月 2009

[Python] swap

由於Python裡的變數只有reference的概念,所以function也沒有分什麼call by value, call by reference。所以,一般C/C++的寫法是不work的。
def swap( a, b ):
    t = a
    a = b
    b = t

#>>> a = 1
#>>> b = 2
#>>> swap( a, b)
#>>> a,b
#>>> (1,2)  # 沒變

要怎麼樣才能讓兩個變數做swap的動作呢?其實很簡單:
a = 1
b = 2
a, b = b, a
#>>> a, b
#>>> (2,1)

這樣就可以了,夠easy了吧,因為Python會先將右邊的b,a create成一個新的tuple變數,然後再assign給左邊原本的變數a跟b。

要把它寫成function也行:
def swap( a, b ):
    return b, a

2 則留言:

James Yang 提到...

第一段code

def swap( a, b ):
t = a
a = b
b = a

b = a 改寫成 b = t 不是swap了?
還是我有漏掉概念?
懇請指教,感謝。

Falldog 提到...

抱歉,這是我的筆誤,應該要改成b=t才是c/c++裡的寫法。
但是,這樣子的寫法在Python裡還是不work的,在swap()結束前a,b的值的確已經對調,但是一離開function後,a, b的值還是原本的值。因為swap()裡面的a, b只是reference到外面的a, b的"新變數",所以最後swap只會改變到swap內的a, b,而改不到function外面的a, b