在刷leecode反轉鍊錶這道題時(輸入: 1->2->3->4->5->null 輸出: 5->4->3->2->1->null),遇到了乙個很有意思的問題。
以下是解答區給出的實現方法,採用多變數同時賦值
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
reverselist
(self, head: listnode)
-> listnode:
cur, pre = head,
none
while cur:
cur.
next
, pre, cur = pre, cur, cur.
next
### ---1
return pre
但是當稍微改變一下—1這一行賦值語句的順序,如修改為 pre, cur, cur.next = cur, cur.next, pre 則會報錯。為了搞清楚這其中的曲折,我們先來了解一下python中多變數賦值的機制。python自帶了乙個位元組碼工具叫dis,通過dis我們可以看到多變數賦值的真相。
import dis
deffoo()
: t=
1 t,a=
3,t+
1dis.dis(foo)
輸出的如下
21 0 load_const 1 (1)
2 store_fast 0 (t)
22 4 load_const 2 (3)
6 load_fast 0 (t)
8 load_const 1 (1)
10 binary_add
12 rot_two
14 store_fast 0 (t)
16 store_fast 1 (a)
18 load_const 0 (none)
20 return_value
python直譯器是基於棧的虛擬機器,load_const和load_fast分別是把常量和變數入棧的操作,rot_two是把棧頂兩個元素翻轉。賦值的時候虛擬機器棧裡面資料變化如下
# 第一步入棧
vm_stack =[.
..,3
, t+1]
=[..
.,3,
2]# 第二步翻轉
vm_stack =[.
..,2
,3]# 第三步賦值
t = vm_stack.pop()=
3a = vm_stack.pop()=
2
簡單來說,可以等價為先計算等式右邊各項的值並且儲存為乙個元組。隨後將這個中間變數–元組儲存一下,再以從左到右的順序一一對應賦值給左邊變數:
在修改後的**中,由於元組中的值從左到右依次賦給pre cur cur.next, 在將③賦值給cur後,cur指向了data為4的結點,因此cur.next代表的不再是data為3的結點的指標域,因此產生了錯誤。
python用,進行多變數賦值
多變數賦值 陣列形式 data hello 18 2002,2 2 name,age,birth data print name print age print birth 多變數賦值 元組形式 data hello 18 2002,2 2 name,age,birth data print nam...
python 多變數的for迴圈
由於本人小白,今天修改公司以前的專案 遇到這樣乙個問題 for channel group in reten df.groupby channel 經過多方查詢才理解 參考先看一下以下例子 x 1,2,3 y 1,2,3 fori,jinzip x,y printi,j結果是 1 1 2 2 3 3...
型別 多變數賦值和命名建議
go noinline go nosplit func test int,int func main 多變數賦值涉及計算規則問題,很多語言對於多變數賦值其實是個坑。go 語言的做法先計算右邊的值,然後批量對左邊進行賦值。a,b 1,2沒有歧義,a,b b 1,a 2怎麼計算呢?第一種解釋先計算b 1...