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

Pyd*_*man 6 python arrays list

在发布此问题后经过一些试验和错误,我观察到以下现象:

>>> [1,2][True]
2
>>>>[1,2][False]
1
>>>>[1,2,3][True]
2
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Ter*_*ryA 27

因为:

>>> True == 1
True
>>> False == 0
True
Run Code Online (Sandbox Code Playgroud)

Boolean是其子类int.它是安全*说True == 1False == 0.因此,您的代码与以下内容相同:

>>> [1, 2][1]
2
>>> [1, 2][0]
1
>>> [1, 2, 3][1]
2
Run Code Online (Sandbox Code Playgroud)

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


*:NB:True并且False在Python <= 2.7中实际上可能会被夸大.注意:

>>> True = 4
>>> False = 5
>>> print True
4
>>> print False
5
Run Code Online (Sandbox Code Playgroud)

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

>>> True = 4
  File "<stdin>", line 1
SyntaxError: assignment to keyword
Run Code Online (Sandbox Code Playgroud)


Jam*_*ley 12

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

如果我们将代码分成几行,那么会发生什么呢?

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

>>> [1,2,3]
[1, 2, 3]
>>> a = [1,2,3]
>>>
Run Code Online (Sandbox Code Playgroud)

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

>>> a[0]
1
>>> a[1]
2
>>>
Run Code Online (Sandbox Code Playgroud)

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

>>> [1,2,3][0]
1
>>> [1,2,3][1]
2
Run Code Online (Sandbox Code Playgroud)

最后,事实证明TrueFalse有可用的指标是因为他们作为整数处理.从数据模型文档:

有三种类型的整数:

普通整数......

长整数.....

布尔

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

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