1. 程式人生 > >python多個變數同時賦值

python多個變數同時賦值

很多東西寫過之後才知道自己什麼都不懂。。。

多變數賦值,寫起來很方便,但是結果卻出乎意料

t=1
t,a=2,t+1

本來我預料a的值是2+1也就是3,結果卻是2。。。

開始以為多變數賦值還是執行多個賦值語句,看來不是這樣,

然後我猜想多變數賦值等號右邊是從右向左執行,測試一下:

def t1():
    print 1
def t2():
    print 2
def t3():
    print 3

a,b,c = t1(),t2(),t3()

結果輸出

1

2

3

證明是從左向右執行的(我怎麼會有這麼奇怪的想法,難道是受賦值語句從右向左執行的影響?)

現在看來,應該是先從左到右計算出右邊的結果然後依次賦值給左邊變數(我擦,這不是正常的做法麼!!)。

補充

這是好久之前的文章了,只說明瞭Python的做法並沒有說明原理,經過幾年的學習,特別是對Python內部實現機制的一些瞭解,下面從位元組碼層面來分析這樣實現的原理。 Python自帶了一個位元組碼工具叫dis,通過dis我們可以看到多行賦值的真相。
import dis

def foo():
    t=1
    t,a=3,t+1
    
dis.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() = 3
a = vm_stack.pop() = 2


廣告:我自己業餘時間也實現了一個Python虛擬機器玩具,有興趣可以瞭解下,歡迎加入或者提出建議  https://github.com/xupingmao/minipy