Python是如何a,b = b,a有效吗?

时间:2014-12-11 04:07:26

标签: python python-internals

我知道我的意思似乎微不足道,但是我无法弄清楚为什么'stop'不等于零,因为'start'值已经被覆盖了。但是当我模拟相同的场景时,它确实覆盖它。我在这里遗漏了什么?

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

1 个答案:

答案 0 :(得分: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