我不理解Python中带负界的切片。这是怎么回事?

2022-03-26 00:00:00 python slice

问题描述

我是一个新手,在我的书中遇到了下面这个没有得到很好解释的例子。这是我从口译员那里打印出来的:

>>> s = 'spam'
>>> s[:-1]
'spa'

为什么没有起始边界和'-1'的切片会返回除最后一个元素之外的所有元素?调用s[0:-1]与调用s[:-1]在逻辑上相同吗?它们返回相同的结果。但我不确定巨蟒到底在做什么。如有任何帮助,将不胜感激。


解决方案

是,调用s[0:-1]与调用s[:-1]完全相同。

在python中使用负数作为索引将返回从列表右侧开始的第n个元素(与通常的左侧相反)。

因此,如果您有这样的列表:

myList = ['a', 'b', 'c', 'd', 'e']
print myList[-1] # prints 'e'

print语句将打印"e"。

一旦您了解了这一点(您可能已经完全不清楚这是否是您感到困惑的事情之一),我们就可以开始讨论切片了。

我假设您了解切片的基本知识,如myList[2:4]所示(将返回['c', 'd']),并直接跳到切片表示法中,其中一面留空。

正如您在帖子中所怀疑的,myList[:index]myList[0:index]完全相同。

顺便说一句,这也是反过来的。myList[index:]myList[index:len(myList)]相同,它将返回列表中从index开始到结束的所有元素的列表(例如,print myList[2:]将打印['c', 'd', 'e'])。

作为第三个注意事项,您甚至可以在没有索引的情况下执行print myList[:],这基本上将返回整个列表的副本(相当于myList[0:len(myList)],返回[‘a’,‘b’,‘c’,‘d’,‘e’])。如果您认为myList将在某个时候更改,但您希望保留其当前状态的副本,则这可能很有用。

如果您还没有这样做,我发现在一个Python解释器中胡乱操作对理解这些事情有很大的帮助。我推荐IPython。

相关文章