2014-12-11 41 views
1

我知道我的表面看起來微不足道,但我無法弄清楚爲什麼'stop'等於零,因爲'start'的值已經被覆蓋了。但是當我模擬出相同的場景時,它確實覆蓋了我在這裏錯過了什麼?Python的a,b = b如何工作?

def interval(start, stop =None, step = 1): 
    'Imitates range() for step >0 ' 
    if stop is None: 
     start, stop = 0, start #since start is already 0, why isn't stop as well? 
     print start,stop , step 
    result = [] 
    i = start 
    while i< stop: 
     result.append(i) 
     i+=step 
    return result 

回答

7

該表達

start, stop = 0, start 

NOT被這樣

start = 0 
stop = start 

評價,但將通過推動兩個值到堆棧和頂部的兩個值將被評估旋轉(以便將值交換),並將值分配回startstop。讓我們考慮,

a = 1 
a, b = 0, a 

如果我們看一下反彙編代碼

import dis 
dis.dis(compile("a = 1; a, b = 0, a", "<string>", "exec")) 

它看起來像

1   0 LOAD_CONST    0 (1) 
       3 STORE_NAME    0 (a) 
       6 LOAD_CONST    1 (0) 
       9 LOAD_NAME    0 (a) 
      12 ROT_TWO 
      13 STORE_NAME    0 (a) 
      16 STORE_NAME    1 (b) 
      19 LOAD_CONST    2 (None) 
      22 RETURN_VALUE 

LOAD_*操作將加載內容到堆棧中。如果你看一下

   6 LOAD_CONST    1 (0) 
       9 LOAD_NAME    0 (a) 

值,0a值被壓入棧,然後ROT_TWO,旋轉在堆棧的頂部兩個位置的值。最後

   13 STORE_NAME    0 (a) 
      16 STORE_NAME    1 (b) 

旋轉值分配給分別ab

相關問題