使用布尔值作为索引的数组切片

3
有人能解释一下这个语法吗?我已经查阅了文档/博客,但没有找到使用布尔值作为数组切片索引的任何提及。我在这个脚本convert_base.py中发现了这个语法:
is_negative = num_as_string[0] == '-'
num_as_string[is_negative:]

我的猜测是False被转换为0,True被转换为1。有没有人确定这一点或者能够指引我查阅相关文档?

>>> a = [1,2,3]
>>> a[True:]
[2,3]
>>> a[False:]
[1,2,3]
>>> a[:False]
[]
>>> a[:True]
[1]
>>> a[False:True]
[1]
>>> a[True:True]
[]
>>> a[False:False]
[]
>>> a[True:False]
[]
>>> a[False::True+1]
[1,3]

最好不要在Python中考虑“类型转换”的概念。虽然这个术语经常被随意使用,但在Python这样一个非常动态的语言中,它几乎没有意义,因为一切都是对象。 - juanpa.arrivillaga
2个回答

4
除了 TrueFalse 是 int 的子类,可以很容易地强制转换为 1 和 0 之外,它们的 __index__ 方法被 Python 切片机制使用时会返回 10
>>> True.__index__()
1
>>> False.__index__()
0

通常您可以通过定义一个 __index__ 方法来使用任意对象进行切片操作:
>>> class Decade(object):
...    def __index__(self):
...        return 10
... 
>>> range(20)[Decade():] # list(range(...))[Decade():] for Python 3
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

1
每天都有新的学习。True + True = 2。 - Tristen
谢谢!这个解释很有帮助。 - Andrew Toy

2

TrueFalsebool的实例,它是int的子类。True的整数值为1,False的整数值为0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接