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

6 則留言:

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

林方傑 提到...

def swap1(a, b):
t = a
a = b
b = t
return a, b

就可以了吧XD

Unknown 提到...

林方傑:
def swap(x, y):
t = x
x = y
y = t
return x, y

a = 1
b = 2
swap(a, b)
print(a, b)
我寫這個樣子
一樣沒有交換

Unknown 提到...

數值、字串、tuple(序對) => 傳值呼叫
串列、集合、字典 => 傳址呼叫

也可以這樣使用
def swap(x):
temp = x[0]
x[0] = x[1]
x[1] = temp
list1 = [1, 2]
swap(list1)
print(list1) #output = [2, 1]

提到...

因為你 swap(a, b) 產生的 (x, y) 沒有東西接,當然不會交換
把該行改成 a, b = swap(a, b) 就會 work 了,不過有點脫褲子放屁,而且還不好讀