比较a,b == 1,2有什么问题?

Sid*_*Sid 10 python python-3.x

为什么下面两个变量的比较返回(1, False, 2),而不是仅仅返回True

a = 1
b = 2
a,b == 1,2
Run Code Online (Sandbox Code Playgroud)

Hra*_*bal 14

本质上,这种明显的怪异行为是由于表达式的右侧是一个元组,而左侧不是。

此行将元组与元组进行比较,从而达到了预期的结果:

(a, b) == (1, 2)
Run Code Online (Sandbox Code Playgroud)

相反,您的表达式等效于:

(a, b == 1, 2)
Run Code Online (Sandbox Code Playgroud)

这是一个元组,包含和,和a之间的比较。b12

您可以使用该dis模块查看python在做什么来查看不同的行为:

import dis

dis.dis("a,b == 1,2")
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 LOAD_CONST               0 (1)
              6 COMPARE_OP               2 (==)
              8 LOAD_CONST               1 (2)
             10 BUILD_TUPLE              3
             12 RETURN_VALUE

 dis.dis("(a,b) == (1,2)")
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 BUILD_TUPLE              2
              6 LOAD_CONST               0 ((1, 2))
              8 COMPARE_OP               2 (==)
             10 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

您可以看到,在第一个评估中python正在loading a,然后先进行加载,然后b再加载比较(1)的右侧元素,然后比较最后两个加载的元素,然后加载第二个右元素,然后使用的结果构建一个元组这些操作并将其返回。

在第二个代码中,python加载了左侧(操作0、2和4),加载了右侧(操作6),比较它们并返回值。


Ale*_*ine 10

您需要使用括号显式比较两个元组:

a = 1
b = 2
print((a,b) == (1,2))  # True
Run Code Online (Sandbox Code Playgroud)

现在,您正在创建元组(a, b == 1, b)。评估为(1, False, 2)