6

在发布此问题后经过反复试验,我观察到以下现象:

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

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

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

谢谢

4

2 回答 2

27

因为:

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

布尔值是 的子类int。这么说是安全的*True == 1False == 0。因此,您的代码与以下内容相同:

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

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


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

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

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

>>> True = 4
  File "<stdin>", line 1
SyntaxError: assignment to keyword
于 2013-07-19T09:34:55.023 回答
12

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

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

第一组[]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是因为它们被视为整数。从数据模型文档

整数分为三种:

纯整数....

长整数......

布尔值

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

因此,[1,2,3][True]等价于[1,2,3][1]

于 2013-07-19T09:52:36.023 回答