Pythona,b=b,a是怎么工作的?

2024-04-29 04:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我的遗嘱看起来微不足道,但我不明白为什么“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

Tags: 函数noneforisdefstep场景range
1条回答
网友
1楼 · 发布于 2024-04-29 04:24:08

这个表达式

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

相关问题 更多 >