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 則留言:

  1. 第一段code

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

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

    回覆刪除
  2. 抱歉,這是我的筆誤,應該要改成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

    回覆刪除
  3. def swap1(a, b):
    t = a
    a = b
    b = t
    return a, b

    就可以了吧XD

    回覆刪除
  4. 林方傑:
    def swap(x, y):
    t = x
    x = y
    y = t
    return x, y

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

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

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

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

    回覆刪除