2013-07-19 149 views
6

继发布this question经过一些试验和错误,我遵守以下现象:Python列表 - True/False前两个元素?

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

如果我添加第三个或后续元素,它没有任何效果。

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

由于

回答

12

这里发生的事情是有点混乱,因为[1,2,3][True]拥有两套正在以不同的方式被解释[]秒。

如果我们将代码分成几行,发生的事情会更加清晰。第一组[] s构造一个列表对象。让我们把该对象的名称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的两个对象 是唯一的布尔型对象。布尔类型是普通整数的子类型,布尔值 的值在几乎所有 上下文中的行为与值0和1分别相同,例外是当转换为字符串时,字符串“False”或“True”分别返回。

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

+1

优秀的解释,谢谢。 – Pyderman

27

因为:

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

布尔是int一个子类。这是安全的*说,True == 1False == 0。因此,你的代码是相同的:

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

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


*:NB:TrueFalse实际上可以在Python < = 2.7被overritten。注意:

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

*:但是,因为Python 3,真假现在关键字。试图重现上面的代码将返回:

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

啊,当然。谢谢你,先生。 – Pyderman

相关问题