为什么在python中使用3个输出进行2次比较?

为什么在python中使用3个输出进行2次比较?,python,comparison,Python,Comparison,我正在尝试以下代码: In [16]: a,b = 1,2 上面按预期将1分配给a,2分配给b,并且没有错误消息: In [18]: a Out[18]: 1 In [19]: b Out[19]: 2 但如果我试着将它们进行比较: In [17]: a,b == 1,2 Out[17]: (1, False, 2) 我得到3个输出。问题出在哪里?这三个输出是什么意思?这里没有问题。是这样评价的 (a, (b == 1), 2) (a, b) == (1, 2) 三个值的元组 在Py

我正在尝试以下代码:

In [16]: a,b = 1,2
上面按预期将1分配给a,2分配给b,并且没有错误消息:

In [18]: a
Out[18]: 1

In [19]: b
Out[19]: 2
但如果我试着将它们进行比较:

In [17]: a,b == 1,2
Out[17]: (1, False, 2)

我得到3个输出。问题出在哪里?这三个输出是什么意思?

这里没有问题。是这样评价的

(a, (b == 1), 2)
(a, b) == (1, 2)
三个值的元组

在Python中,如果元组包含多个元素,则不需要使用括号来创建元组。因此,根据Python语法,这被视为一个元组。这是有案可查的,

除非显示列表或集合的一部分,否则至少包含一个逗号的表达式列表将生成元组。元组的长度是列表中表达式的数量。表达式从左到右求值

只有创建一个元组(也称为单元组)才需要后面的逗号;它在所有其他情况下都是可选的。没有尾随逗号的单个表达式不会创建元组,而是生成该表达式的值。(要创建空元组,请使用一对空括号:())


为了达到你想要的,你需要这样做

(a, (b == 1), 2)
(a, b) == (1, 2)
这是多重赋值,其中变量a和b同时给定值1和2。首先从左到右计算右侧表达式

  a,b==1,2

这里只取b==1。这就是为什么结果是1,True,2

python中的
dis
模块可以帮助您查看引擎盖下发生了什么

>>> from dis import dis

>>> def bo(a=2,b=3):
...     print a,b==2,3
... 
>>> dis(bo)
  2           0 LOAD_FAST                0 (a)
              3 PRINT_ITEM          
              4 LOAD_FAST                1 (b)
              7 LOAD_CONST               1 (2)
             10 COMPARE_OP               2 (==)
             13 PRINT_ITEM          
             14 LOAD_CONST               2 (3)
             17 PRINT_ITEM          
             18 PRINT_NEWLINE       
             19 LOAD_CONST               0 (None)
             22 RETURN_VALUE        
>>> bo()
2 False 3
>>> def bo(a=2,b=3):
...     print a,b==3,2
... 
>>> bo()
2 True 2
如果我们使用
a,b==3,2
a=2
b=3
时,元组的中间元素将 有真正的价值

首先,
a
b
被推到堆栈上,并与相应的值进行比较,然后形成一个元组

所以实际上,比较是按相反的顺序进行的

因此,颠倒元素的顺序可以在结果元组中为我们提供正确的值

简言之

def bo(a=1,b=2,c=3,d=4):
    print a,b,c,d==4,3,2,1
bo()
将打印

1 2 3 True 3 2 1

因此,我们可以访问元组中间元素以获得正确的值,那么我如何将这两个元素一起求值并得到1或2个比较输出?我可以在使用一个比较运算符时得到2个比较输出吗?不可以。这是不可能的。
列表(map(lambda x,y:x==y[a,b],[1,2])
?它不是有效的表达式。即使您执行了
列表(map(lambda x,y:x==y,[[a,b],[1,2]])
,也会对列表中的每个内部项执行比较运算符。