在下面的代码中,两者a
and b
是生成器函数的输出,并且可以评估为None
或者有一个值。
def testBehaviour(self):
a = None
b = 5
while True:
if not a or not b:
continue
print('blaat')
如果我将断点(使用 Visual Studio Code)放在带有continue
声明,以及与print
声明,都没有被击中。这print
语句没有被调用,循环只是按照预期无限期地运行,但我希望断点被命中。
如果我将代码更改为以下之一:
def testBehaviour(self):
a = None
b = 5
while True:
if not a:
continue
print('blaat')
or:
def testBehaviour(self):
a = None
b = 5
while True:
if not a or not b:
c = 'dummy'
continue
print('blaat')
再次在带有以下内容的行上放置断点continue
and print
语句,断点被命中。
谁能告诉我为什么断点没有被命中?这似乎不仅仅发生在 Visual Studio Code 中,因为我们的代码覆盖工具还指出continue
声明未被调用。
这是在 Windows 7 32 位上的 python 2.7 上。
操作码有一个优化,编译器可以识别if expr: continue
.
使用时if not a or not b:
11 12 SETUP_LOOP 35 (to 50)
>> 15 LOAD_GLOBAL 1 (True)
18 POP_JUMP_IF_FALSE 49
12 21 LOAD_FAST 1 (a)
24 UNARY_NOT
25 POP_JUMP_IF_TRUE 15
28 LOAD_FAST 2 (b)
31 UNARY_NOT
32 POP_JUMP_IF_FALSE 41
13 35 JUMP_ABSOLUTE 15
38 JUMP_FORWARD 0 (to 41)
14 >> 41 LOAD_CONST 2 ('blaat')
44 PRINT_ITEM
45 PRINT_NEWLINE
46 JUMP_ABSOLUTE 15
>> 49 POP_BLOCK
>> 50 LOAD_CONST 0 (None)
53 RETURN_VALUE
线路25 POP_JUMP_IF_TRUE 15
跳回 while 循环的开头(第 15 行)如果not a
是真的。它永远不会到达 continue 语句的行35 JUMP_ABSOLUTE 15
如果您切换以下值a
and b
这个测试用例有效。
如果将测试表达式重写为if not ( a and b ):
你会得到以下操作码
11 12 SETUP_LOOP 33 (to 48)
>> 15 LOAD_GLOBAL 1 (True)
18 POP_JUMP_IF_FALSE 47
12 21 LOAD_FAST 1 (a)
24 JUMP_IF_FALSE_OR_POP 30
27 LOAD_FAST 2 (b)
>> 30 POP_JUMP_IF_TRUE 39
13 33 JUMP_ABSOLUTE 15
36 JUMP_FORWARD 0 (to 39)
14 >> 39 LOAD_CONST 2 ('blaat')
42 PRINT_ITEM
43 PRINT_NEWLINE
44 JUMP_ABSOLUTE 15
>> 47 POP_BLOCK
>> 48 LOAD_CONST 0 (None)
51 RETURN_VALUE
这总是有效并且更快。这not
操作被优化成跳转测试语句
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)