Python 多變數賦值的機制(以反轉鍊錶為例)

2021-10-24 10:30:52 字數 2067 閱讀 2889

在刷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...