Python 同時賦值問題
在平時需要交換兩個變量的值時,我們通常是這麼寫的
item = a
a = b
b = item
Python 中提供了一種更爲簡便的技巧,可以用同時給變量賦值,類似這種:
a, b = b, a
這兩種方式得到的結果是相同的,那如此神奇的代碼,實現原理是什麼呢?
原理
在 Python 中,多重賦值的功能是通過迭代對象解包
這一方法實現的,也被稱作元組解包
a, b = 1, 2
這行代碼的意思是講a
設爲1
,b
爲2
,在底層代碼中,實際上是創建了一個(1, 2)
的元組,通過遍歷元組取到了1
和2
的值,分別賦給a
和b
因爲 Python 在中,元組兩側的括號實際上是可以省略的,即:
tup = 1, 2
print(tup)
# 輸出:(1, 2)
所以在多重賦值中,元組的()
也可以被省略,便有了上邊多重賦值的語法
實際上,多重賦值也並不一定是通過元組,所有可迭代的對象都可以使用這種語法,例如:
a, b = [1, 2]
s1, s2 = 'ab'
通俗的講
如果理解不來底層的思想,我們可以這麼理解多重賦值,即先確定=
右邊的值,再將其賦給左邊
例子(反轉鏈表)
我們可以通過一個 Python 實現的反轉鏈表
來使用多重賦值,其他所有語言都需要設定一個臨時變量來存儲cur.next
的值,而 Python 可以避免這種複雜的代碼,Python 和 Java 的代碼如下,請大家自行對比:
def reverseList(head):
cur, prev = head, None
while cur:
# 多重賦值
cur.next, prev, cur = prev, cur, cur.next
return prev
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while (cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
總結
多重賦值是 Python 一個很實用的語法糖,不僅可以簡化代碼的複雜程度,還可以大大提高代碼的逼格!借漢奇大佬一句話多瞭解語言機制比學工具有用
,奧裏給!