带括号和括号的特殊条件语法

时间:2015-08-03 09:34:32

标签: python

是否有关于以下Python条件语法的任何解释?

>>> a = 10
>>> s = (0, 1)[a<10]
>>> print s
0
>>> a = -10
>>> s = (0, 1)[a<10]
>>> print s
1

它似乎像if语句一样工作。为什么这样做?

2 个答案:

答案 0 :(得分:7)

在Python中,boolint的子类。

>>> issubclass(bool, int)
True

换句话说,False等于0,True等于1:

>>> False == 0
True
>>> True == 1
True

因此它们可以用作索引:

>>> ['No', 'Yes'][False]  # ['No', 'Yes'][0]
'No'
>>> ['No', 'Yes'][True]   # ['No', 'Yes'][1]
'Yes'

表达式a < 10根据True的值产生Falsea。因此(0, 1)[a < 10]会相应地产生01

答案 1 :(得分:5)

(0, 1)是一个2元素tuple。您可以使用index accessors [0][1]来访问其值,如下所示:

>>> (0, 1)[0]
0
>>> (0, 1)[1]
1

现在,在Python中,布尔值TrueFalse实际上是int的实例(因为boolint的子类型):< / p>

>>> issubclass(bool, int)
True
>>> isinstance(True, int)
True
>>> isinstance(False, int)
True

TrueFalse的int值为10

>>> True == 1
True
>>> False == 0
True

所以你实际上可以使用它们两个访问2元素元组中的元素:

>>> (0, 1)[False]
0
>>> (0, 1)[True]
1

这就解释了为什么在那里指定一个返回布尔值的条件也会起作用。

documentation(强调我的)中也提到了这一点:

  

布尔值是两个常量对象FalseTrue。它们用于表示真值(尽管其他值也可以被认为是假或真)。 在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别与整数0和1相似。