問題起源
假設我們想交換兩個杯子的飲料:
如果直接把杯 A 倒入杯 B,再把杯 B 倒入杯 A……你會得到一杯混合飲料,不是交換。
這就是程式中 a = b; b = a 的問題所在。
為什麼需要暫存變數?
# 錯誤方法(值會被覆蓋)
a = 1
b = 2
a = b # a 現在是 2,原本的 1 不見了!
b = a # b 還是 2
print(a, b) # 2 2 (不是我們要的 2 1)
# 正確方法:使用暫存變數
a = 1
b = 2
temp = a # 先把 a 存到 temp
a = b # 覆蓋 a
b = temp # 從 temp 恢復原本的 a
print(a, b) # 2 1 (正確!)
Python 的 Tuple 解包(語法糖)
Python 提供了更優雅的寫法,底層仍是類似暫存的機制:
a = 1
b = 2
a, b = b, a # Python 先建立右側 tuple (2, 1),再解包賦值
print(a, b) # 2 1
XOR 交換(進階)
不用任何額外記憶體空間的位元運算技巧:
a = 5 # 二進位: 101
b = 3 # 二進位: 011
a = a ^ b # a = 110 = 6
b = a ^ b # b = 110 ^ 011 = 101 = 5 (原本的 a)
a = a ^ b # a = 110 ^ 101 = 011 = 3 (原本的 b)
print(a, b) # 3 5
前往互動遊戲,用拖拉的方式直覺理解三種交換模式!