在所有3个示例中看到的都是语言的
语法规范的结果,以及在源代码中遇到的标记如何解析以生成解析树。
查看这个低级别的代码应该可以帮助您了解底层发生了什么。我们可以将这些Python语句转换为字节码,然后使用
dis
模块对其进行反汇编:
情况1:
(0, 0) == 0, 0
>>> dis.dis(compile("(0, 0) == 0, 0", '', 'exec'))
1 0 LOAD_CONST 2 ((0, 0))
3 LOAD_CONST 0 (0)
6 COMPARE_OP 2 (==)
9 LOAD_CONST 0 (0)
12 BUILD_TUPLE 2
15 POP_TOP
16 LOAD_CONST 1 (None)
19 RETURN_VALUE
“(0, 0)”首先与“0”进行比较并评估为“False”。然后使用此结果和最后一个“0”构建元组,因此得到“(False, 0)”。
案例2: “0, 0 == (0, 0)”
>>> dis.dis(compile("0, 0 == (0, 0)", '', 'exec'))
1 0 LOAD_CONST 0 (0)
3 LOAD_CONST 0 (0)
6 LOAD_CONST 2 ((0, 0))
9 COMPARE_OP 2 (==)
12 BUILD_TUPLE 2
15 POP_TOP
16 LOAD_CONST 1 (None)
19 RETURN_VALUE
一个元组的第一个元素是
0
。对于第二个元素,与第一种情况相同的检查被执行并且评估为
False
,因此你得到了
(0, False)
。
情况3:
(0, 0) == (0, 0)
。
>>> dis.dis(compile("(0, 0) == (0, 0)", '', 'exec'))
1 0 LOAD_CONST 2 ((0, 0))
3 LOAD_CONST 3 ((0, 0))
6 COMPARE_OP 2 (==)
9 POP_TOP
10 LOAD_CONST 1 (None)
13 RETURN_VALUE
这里,正如你所看到的,你只是在比较这两个元组
(0, 0)
并返回
True
。