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)
这个表达
start, stop = 0, start
Run Code Online (Sandbox Code Playgroud)
会不喜欢这个评价
start = 0
stop = start
Run Code Online (Sandbox Code Playgroud)
但是将通过将两个值都推送到堆栈来评估,并且将旋转前两个值(以便交换值)并将值分配回start和stop.让我们考虑一下,
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)
旋转的值分配给a和b分别.
| 归档时间: |
|
| 查看次数: |
4794 次 |
| 最近记录: |