1. 程式人生 > >Python連續賦值需要注意的地方

Python連續賦值需要注意的地方

在python中是可以使用連續賦值的方式來一次為多個變數進行賦值的,比如:

a = b = c = 1
a, b, c = 1, 1, 1

這些都可以完成變數的賦值,但是就有一個問題了,比如:

a = 3
a, b = 1, a

如果按照正常的思維邏輯,先進行a = 1,在進行b = a,最後b應該等於1,但是這裡b應該等於3,因為在連續賦值語句中等式右邊其實都是區域性變數,而不是真正的變數值本身,比如,上面例子中右邊的a,在python解析的時候,只是把變數a的指向的變數3賦給b,而不是a=1之後a的結果,這一點剛開始學python的人可能容易誤解,再舉一個Leetcode裡連結串列的例子理解就更深了。

假如要對一個連結串列進行翻轉,就比如把1—>2->3->4轉化為4->3->2->1

對於這個問題很簡單,只要反轉指標就可以了,假如連結串列結構為:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

我們可以用很簡單的三行程式碼完成這個過程:

def reverseList(self, head):
        L = ListNode(float("-inf"))
        while head:
            L.next, head.next, head = head, L.next, head.next
        return
L.next

這裡的L是指向一個新建的結點,因為python沒有指標的概念,所以用一個額外的結點來代替頭指標,這裡的核心程式碼就是中間那一行三個變數的連續賦值,如果單獨一句句來理解的話,最後肯定是想不通的,在這裡,假設head結點是連結串列串’1->2->3->4’的頭結點,先用新的L結點的next指標指向head的第一個結點‘1’,之後將L.next(第一次也就是空)賦給了head的next指標,之後再把head的next指標(注意,這裡的next指標還是指向‘2’的,而不是空)賦給head,相當於next向前移一位,這一步相當於一個串變成了兩個:

L:‘-inf’->‘1’
head:‘2’->‘3’->‘4’->‘5’