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

use*_*686 1 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
Run Code Online (Sandbox Code Playgroud)

the*_*eye 7

这个表达

start, stop = 0, start
Run Code Online (Sandbox Code Playgroud)

喜欢这个评价

start = 0
stop = start
Run Code Online (Sandbox Code Playgroud)

但是将通过将两个值都推送到堆栈来评估,并且将旋转前两个值(以便交换值)并将值分配回startstop.让我们考虑一下,

a = 1
a, b = 0, a
Run Code Online (Sandbox Code Playgroud)

如果我们看一下反汇编的代码

import dis
dis.dis(compile("a = 1; a, b = 0, a", "<string>", "exec"))
Run Code Online (Sandbox Code Playgroud)

看起来像

  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
Run Code Online (Sandbox Code Playgroud)

LOAD_*操作将在堆栈加载内容.如果你看看

              6 LOAD_CONST               1 (0)
              9 LOAD_NAME                0 (a)
Run Code Online (Sandbox Code Playgroud)

将值0和值a推入堆栈然后ROT_TWO旋转堆栈顶部两个位置的值.最后

             13 STORE_NAME               0 (a)
             16 STORE_NAME               1 (b)
Run Code Online (Sandbox Code Playgroud)

旋转的值分配给ab分别.