MaxU - stop genocide of UA Asked:2020-06-12 23:18:28 +0000 UTC2020-06-12 23:18:28 +0000 UTC 2020-06-12 23:18:28 +0000 UTC 操作顺序:为什么 ('1' in '111' == True) 返回 False 772 在这个问题中,有一些代码可以简化形式写成这样: >>> '1' in '111' == True False 为什么会这样?毕竟,根据“运算符优先级”表,和in和==具有相同的优先级,必须从左到右执行。 那些。假设这种构造是等价的是合乎逻辑的: >>> ('1' in '111') == True True python 2 个回答 Voted MaxU - stop genocide of UA 2020-06-12T23:18:28Z2020-06-12T23:18:28Z 似乎这种结构被视为“链式比较”,例如: a < b <= c 这相当于 a < b and b <= c 那些。 '1' in '111' == True 将被处理为: '1' in '111' and '111' == True 让我们检查一下猜测: >>> '1' in '111' == '111' True Best Answer godva 2020-06-13T17:49:24Z2020-06-13T17:49:24Z 让我们使用 dis 模块来分析字节码 import dis dis.dis("'1' in '111' == True") 我们得到以下输出 1 0 LOAD_CONST 0 ('1') 2 LOAD_CONST 1 ('111') 4 DUP_TOP 6 ROT_THREE 8 COMPARE_OP 6 (in) 10 JUMP_IF_FALSE_OR_POP 18 12 LOAD_CONST 2 (True) 14 COMPARE_OP 2 (==) 16 RETURN_VALUE >> 18 ROT_TWO 20 POP_TOP 22 RETURN_VALUE LOAD_CONST指令将常量加载到栈中,DUP_TOP复制栈顶的值并压入栈,ROT_THREE将栈1位置上的值2和3提升,压入栈顶的值向下堆栈到位置 3。因此,在堆栈上的 in 操作(偏移量 8)之前,值 ['111', '1', '111'] 被存储。事件的发展有两种可能的情况: 如果接收到假值,用[False, '111']的栈去偏移18,ROT_TWO会交换栈顶的两个值,得到一个['111', False]的栈。POP_TOP 将删除“111”,RETURN_VALUE 将返回 False。 如果在偏移量 12 处执行 LOAD_CONST 后得到一个真值,则堆栈将包含以下值[True, '111']。接下来,True 和 '111' 之间的比较操作发生,其结果被压入堆栈然后返回。 原来执行表达式'1' in '111' == True的结果将等于执行的结果'1' in '111' and '111' == True
似乎这种结构被视为“链式比较”,例如:
这相当于
那些。
将被处理为:
让我们检查一下猜测:
让我们使用 dis 模块来分析字节码
我们得到以下输出
LOAD_CONST指令将常量加载到栈中,DUP_TOP复制栈顶的值并压入栈,ROT_THREE将栈1位置上的值2和3提升,压入栈顶的值向下堆栈到位置 3。因此,在堆栈上的 in 操作(偏移量 8)之前,值 ['111', '1', '111'] 被存储。事件的发展有两种可能的情况:
如果接收到假值,用[False, '111']的栈去偏移18,ROT_TWO会交换栈顶的两个值,得到一个['111', False]的栈。POP_TOP 将删除“111”,RETURN_VALUE 将返回 False。
如果在偏移量 12 处执行 LOAD_CONST 后得到一个真值,则堆栈将包含以下值[True, '111']。接下来,True 和 '111' 之间的比较操作发生,其结果被压入堆栈然后返回。
原来执行表达式
'1' in '111' == True的结果将等于执行的结果'1' in '111' and '111' == True