Python列表 - 真/假前两个元素?

时间:2013-07-19 09:34:15

标签: python arrays list

在发布this question后经过一些试验和错误后,我发现了以下现象:

>>> [1,2][True]
2
>>>>[1,2][False]
1
>>>>[1,2,3][True]
2

如果我添加第三个或后续元素,则无效。

有人能指出我对这些观察的解释吗?我认为这是与任何Python列表中前两个元素相关的一般属性?

由于

2 个答案:

答案 0 :(得分:27)

由于:

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

Boolean是int的子类。说True == 1False == 0是安全的*。因此,您的代码与:

相同
>>> [1, 2][1]
2
>>> [1, 2][0]
1
>>> [1, 2, 3][1]
2

这就是为什么当你添加更多元素时,输出将保持不变。它与列表的长度无关,因为它只是影响前两个值的基本索引。


*:注意:TrueFalse实际上可能在Python< = 2.7中被覆盖。观察:

>>> True = 4
>>> False = 5
>>> print True
4
>>> print False
5

*:但是,由于Python 3,True和False现在是关键字。尝试重现上面的代码将返回:

>>> True = 4
  File "<stdin>", line 1
SyntaxError: assignment to keyword

答案 1 :(得分:12)

这里发生的事情有点令人困惑,因为[1,2,3][True]有两组[]以不同方式解释。

如果我们将代码分成几行,那么发生的事情会更清楚。

第一组[]构造一个列表对象。让我们为该对象分配名称a

>>> [1,2,3]
[1, 2, 3]
>>> a = [1,2,3]
>>>

第二组[]指定该列表中的索引。你通常会看到这样的代码:

>>> a[0]
1
>>> a[1]
2
>>>

但是直接使用列表对象同样有效,而没有给它起一个名字:

>>> [1,2,3][0]
1
>>> [1,2,3][1]
2

最后,TrueFalse可用作索引的事实是因为它们被视为整数。来自data model docs

  

有三种类型的整数:

     

普通整数......

     

长整数.....

     

布尔

     

这些代表真值False和True。他们俩     表示值False和True的对象是唯一的布尔值     对象。 Boolean类型是普通整数的子类型,也是布尔值     在几乎所有的值中,值的行为分别类似于值0和1     上下文,例外的是当转换为字符串时,     字符串“False”或“True”分别返回。

因此,[1,2,3][True]相当于[1,2,3][1]