Python中的a,b = b,a是如何工作的?

4

我知道我的问题似乎微不足道,但是我想不通为什么“停止”不等于零,因为“开始”值已经被覆盖。但是当我在函数外模拟相同的情况时,它确实被覆盖了。我错过了什么吗?

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个回答

13

这个表达式

start, stop = 0, start

不会像这样进行评估

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接