Python連續賦值需要注意的地方
阿新 • • 發佈:2019-02-06
在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’