2014-12-11 4 views
1

나는 내 의지가 사소한 것처럼 느껴진다. 그러나 '시작'값이 이미 덮어 써져 있기 때문에 왜 '멈춤'이 '0'이 아닌지 알아낼 수 없다. 그러나 같은 시나리오를 실제로 시뮬레이트하면 실제로 덮어 쓰게된다. 그거 여기 뭔가 있는게 없니?파이썬의 a, b = b, a는 어떻게 작동합니까?

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 

같이 평가되지만 스택에 값 가기 두 값 것 모두를 추진하여 평가한다

이 식은 rotate (값이 스왑되도록)하고 값은 startstop에 다시 지정됩니다. 우리는 스택의 내용을로드

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_* 작업과 같을 것이다 디스 어셈블 된 코드

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

보면,

a = 1 
a, b = 0, a 

을 고려 할 수 있습니다. 당신이

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

값, 0a의 값이 스택에 푸시 된 후 ROT_TWO 보면, 스택의 상단이 위치에있는 값을 회전합니다. 그리고 마지막으로

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

은 각각 ab에 회전 값을 할당합니다.

관련 문제