python多個變數同時賦值
阿新 • • 發佈:2019-01-03
很多東西寫過之後才知道自己什麼都不懂。。。
本來我預料a的值是2+1也就是3,結果卻是2。。。
輸出的如下
廣告:我自己業餘時間也實現了一個Python虛擬機器玩具,有興趣可以瞭解下,歡迎加入或者提出建議 https://github.com/xupingmao/minipy
多變數賦值,寫起來很方便,但是結果卻出乎意料
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)
輸出的如下
Python直譯器是基於棧的虛擬機器,LOAD_CONST和LOAD_FAST分別是把常量和變數入棧的操作,ROT_TWO是把棧頂兩個元素翻轉。賦值的時候虛擬機器棧裡面資料變化如下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
# 第一步入棧
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