您在所有 3 个实例中看到的是该语言的 grammar specification 的结果,以及如何解析源代码中遇到的标记以生成解析树。
看看这个低级代码应该可以帮助您了解幕后发生的事情。我们可以将这些 python 语句转换成字节码,然后使用dis 模块进行反编译:
案例一:(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。