python同步賦值交換 python交換和賦值

2021-10-11 04:27:59 字數 1089 閱讀 6855

通常,我們使用a [i],a [j] = a [j],a [i]來交換.

這有時可能無效.例如,

a=[1, 2]

a[0], a[a[0]] = a[a[0]], a[0]

將失敗.為什麼會失敗以及如何解釋賦值?

解決方法:

讓我們看看有問題的語句的位元組碼:

>>> def f(a):

... a[0], a[a[0]] = a[a[0]], a[0]

>>> dis.dis(f)

2 0 load_fast 0 (a)

3 load_fast 0 (a)

6 load_const 1 (0)

9 binary_subscr

10 binary_subscr

11 load_fast 0 (a)

14 load_const 1 (0)

17 binary_subscr

18 rot_two

19 load_fast 0 (a)

22 load_const 1 (0)

25 store_subscr

26 load_fast 0 (a)

29 load_fast 0 (a)

32 load_const 1 (0)

35 binary_subscr

36 store_subscr

37 load_const 0 (none)

40 return_value

這樣工作如下:

>指令0-10在值堆疊上按a [a [0]],因此為2

>指令11-17在值堆疊上按a [0],現在為2,1

>指令18交換它們,堆疊為1,2

>指令19-25將最高值(2)分配給a [0],將值堆疊保留為1

>指令26-36嘗試為a [a [0]]賦值,但a [0]現在為2,所以它試圖分配給a [2],這是乙個indexerror.

簡而言之,問題是在分配給a [0]之後才評估左側的a [a [0]].

作為修復,我建議:

a0 = a[0]

a[0], a[a0] = a[a0], a[0]

標籤:python,swap

python同步賦值交換 python交換和賦值

讓我們看看有問題的語句的位元組碼 def f a a 0 a a 0 a a 0 a 0 dis.dis f 2 0 load fast 0 a 3 load fast 0 a 6 load const 1 0 9 binary subscr 10 binary subscr 11 load fas...

字串賦值,查詢,交換

00401000 ba 90204000 mov edx,00402090 源位址 0040100e b9 01000000 mov ecx,0x1 迴圈次數為1 00401013 f3 a4 rep movs byte ptr es edi byte ptr esi 位元組為單位傳遞 004010...

python怎麼給x賦值 Python賦值魔法技巧

實驗環境 root localhost python v python 2.7.5 1.序列解包 多個賦值操作可以同時進行 x,y,z 1,2,3 x print y,z 2 3交換兩個或者多個變數也是可以的 x,y y,x print x,y,z 2 1 3 這裡所做的事叫做序列解包或者遞迴解包 ...