Python——語法糖:多重賦值(元組解包、迭代對象解包)問題及原理

Python 同時賦值問題

​ 在平時需要交換兩個變量的值時,我們通常是這麼寫的

item = a
a = b
b = item

​ Python 中提供了一種更爲簡便的技巧,可以用同時給變量賦值,類似這種:

a, b = b, a

​ 這兩種方式得到的結果是相同的,那如此神奇的代碼,實現原理是什麼呢?

原理

​ 在 Python 中,多重賦值的功能是通過迭代對象解包這一方法實現的,也被稱作元組解包

a, b = 1, 2

​ 這行代碼的意思是講a設爲1b2,在底層代碼中,實際上是創建了一個(1, 2)的元組,通過遍歷元組取到了12的值,分別賦給ab

​ 因爲 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 一個很實用的語法糖,不僅可以簡化代碼的複雜程度,還可以大大提高代碼的逼格!借漢奇大佬一句話多瞭解語言機制比學工具有用,奧裏給!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章