奇怪的Python布尔运算符

奇怪的Python布尔运算符,python,python-2.x,Python,Python 2.x,我看到了以下简单代码的一些变体: if dist_1>dist_2 : print enemy_2 else: print enemy_1 变更1: print (enemy_1, enemy_2)[dist_1 > dist_2] 变式2: e1, d1, e2 = (raw_input() for _ in '123') print (e1, e2)[d1 > raw_input()] 有人能解释一下这个打印(x,y)[x>y]代码是如何工作的吗 布尔

我看到了以下简单代码的一些变体:

if dist_1>dist_2 :
    print enemy_2
else:
    print enemy_1
变更1:

print (enemy_1, enemy_2)[dist_1 > dist_2]
变式2:

e1, d1, e2 = (raw_input() for _ in '123')
print (e1, e2)[d1 > raw_input()]

有人能解释一下这个
打印(x,y)[x>y]
代码是如何工作的吗

布尔实际上是Python中整数的一个子类:

isinstance(True, int)
isinstance(False, int)
这两种说法都是正确的。因此,您可以使用布尔值索引两元素序列。如果布尔值为
False
,则将获得第一个元素。如果布尔值为
True
,则将获得第二个元素

表达式
(敌方1,敌方2)
创建一个双元素
元组<代码>[dist_1>dist_2]
提供布尔索引。
打印
是偶然的;它只是用来输出结果。

如果你把一些元素放在至少有一个逗号的元组中,它就会变成一个元组。与列表类似,您可以为元组编制索引。通常使用整数进行索引。但是,如果使用布尔值进行索引,则False将解释为0,True将解释为1

因此,代码:

(enemy_1, enemy_2)[dist_1 > dist_2]
在英语中解释为“如果dist_1>大于dist_2,则从元组中给我项目1,否则给我项目0。”


如果你愿意,你可以做一个元组教程。

我在这里添加了一个Python2标记,因为我很确定这在Python3中不起作用。它只是一个元组,根据
x>y
的结果访问0或1。…@madphyperator在3.6.0下没有时间进行测试。它起作用了@朱尔斯。我不相信你<代码>e1、e2、d1、d2=‘a’、‘b’、1、2;打印(e1,e2)[d1>d2]引发
TypeError:“NoneType”不可订阅
错误。paren现在是函数参数定界符,而不是元组定界符。否决这个问题,或者将其标记为离题,这是多么荒谬的事情啊。我认为OP只是表明他愿意不辞辛劳地查找它。但答案远非琐碎,如果你不是Python专家,在书中肯定不容易找到,“如果你把某个东西放在parens中,它就会变成一个元组”。不一定是:
(2)
是元组吗?@Jean-Françoisfare-Notpick:如果它是函数调用的一部分,那么是的,它可以成为元组的一部分(或者如果函数接受
*args
):-)以防止混淆:类型bool是从int类型派生的,因此isinstance(2,bool)是False。所以布尔确实是整数,但整数不是布尔。就像猫是动物一样,但动物不一定是猫。@Jacquesdhooge。我不认为相反的说法是错误的这一点特别重要,但我确实让我的语言更精确地表明了这一点。我很想知道为什么会投反对票。我的解释有什么不真实的地方吗?或者根本没有什么地方?你的语言很简洁。这只是一个澄清。在日常语言中,当人们说“是”时,他们认为它是“平等的”,而不是“是”。顺便说一句,你的答案中没有缺少什么,只是一些有趣的人否决了一切。。。