继发布this question经过一些试验和错误,我遵守以下现象:Python列表 - True/False前两个元素?
>>> [1,2][True]
2
>>>>[1,2][False]
1
>>>>[1,2,3][True]
2
如果我添加第三个或后续元素,它没有任何效果。
有人可以指出我对这些观察的解释吗?我认为这是一些与任何Python列表中的前两个元素有关的一般属性?
由于
继发布this question经过一些试验和错误,我遵守以下现象:Python列表 - True/False前两个元素?
>>> [1,2][True]
2
>>>>[1,2][False]
1
>>>>[1,2,3][True]
2
如果我添加第三个或后续元素,它没有任何效果。
有人可以指出我对这些观察的解释吗?我认为这是一些与任何Python列表中的前两个元素有关的一般属性?
由于
这里发生的事情是有点混乱,因为[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
最后,事实证明True
和False
可用作索引是因为它们被视为整数。从data model docs:
有三种类型的整数:
普通整数....
长整数.....
布尔
这些代表真值虚假与真实。表示值False和True的两个对象 是唯一的布尔型对象。布尔类型是普通整数的子类型,布尔值 的值在几乎所有 上下文中的行为与值0和1分别相同,例外是当转换为字符串时,字符串“False”或“True”分别返回。
因此,[1,2,3][True]
相当于[1,2,3][1]
因为:
>>> True == 1
True
>>> False == 0
True
布尔是int
一个子类。这是安全的*说,True == 1
和False == 0
。因此,你的代码是相同的:
>>> [1, 2][1]
2
>>> [1, 2][0]
1
>>> [1, 2, 3][1]
2
这就是为什么当你加入更多的元素,输出将保持不变。它与列表的长度无关,因为它只是影响前两个值的基本索引。
*:NB:True
和False
实际上可以在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
啊,当然。谢谢你,先生。 – Pyderman
优秀的解释,谢谢。 – Pyderman