为什么在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,2python中的
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]])
,也会对列表中的每个内部项执行比较运算符。