我知道我的意思似乎微不足道,但是我无法弄清楚为什么'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
答案 0 :(得分:7)
此表达式
start, stop = 0, start
将 NOT 评估为
start = 0
stop = start
但是将通过将两个值都推送到堆栈来评估,并且将旋转前两个值(以便交换值),并将值分配回start
和stop
。让我们考虑一下,
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)
将值0
和a
中的值推送到堆栈然后ROT_TWO
,旋转堆栈顶部两个位置的值。最后
13 STORE_NAME 0 (a)
16 STORE_NAME 1 (b)
分别将轮换值分配给a
和b
。