简单Python字符串(向后)切片

简单Python字符串(向后)切片,python,python-3.x,slice,Python,Python 3.x,Slice,是的,我知道上面有很多类似的问题。但我就是找不到我要找的东西 我的困惑是关于反向切片 my_jumble = ['jumbly', 'wumbly', 'number', 5] print(my_jumble[:1:-1]) 现在我发现结果会是 [5, 'number'] 所以我想也许我会通过改变绳子切片的末端来测试它 print(my_jumble[:2:-1]) 我确信Python会给我类似的东西 [5, 'number', 'wumbly'] 相反,它给了我这个让我完全迷路的东西

是的,我知道上面有很多类似的问题。但我就是找不到我要找的东西

我的困惑是关于反向切片

my_jumble = ['jumbly', 'wumbly', 'number', 5]
print(my_jumble[:1:-1])
现在我发现结果会是

[5, 'number']
所以我想也许我会通过改变绳子切片的末端来测试它

print(my_jumble[:2:-1])
我确信Python会给我类似的东西

[5, 'number', 'wumbly']
相反,它给了我这个让我完全迷路的东西

[5]

有人能解释一下这是怎么回事吗?我是Python新手,发现这非常令人困惑。。谢谢你的帮助。

@HarryLens要做你真正想做的事,你必须这样做

print(my_jumble[-1:0:-1])
即使这样也可以:

print(my_jumble[:0:-1])

我想你相信当你跨过a-1时,列表是相反的。可以看到,第一个数字表示当前列表中的起始位置,第二个数字表示当前列表中(所需切片的)结束位置,而不是反向列表。参考

我认为理解代码中发生的事情的最简单的方法之一是理解反向切片在被切片之前反转列表的索引方式(视觉上,就像反转列表一样),但是列表中元素的索引本身不会改变

因此,当您有这样一个列表时:

['jumbly', 'wumbly', 'number', 5]
    0        1         2       3   #<-- index
然后,当你从“开始”切到一(
:1
)时,你从“开始”得到了一切(现在“开始”是
3
),当看到
1
时停止:

[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      ^         x
 grab! grab!      nope!
使用
[:2:-1]
向后切片时,同样的原则也适用:

[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      x
 grab!  nope!
[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      ^         ^       x
 grab!  grab!     grab!   nope!
现在,使用这个原理,如果您想要返回您想要的内容,您知道将什么作为第二个索引器:zero-->
[:0:-1]

[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      x
 grab!  nope!
[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      ^         ^       x
 grab!  grab!     grab!   nope!

您使用的语法是
list[start:stop:step]

如果没有为
start
输入值,甚至不为零,那么python将决定一个合适的开始。正向步骤为
0
,负向步骤为最后一个元素

因此,在第一个示例中,您实际上是说选择所有项目,从
0
,直到
1
,但顺序相反。所以它打印出了
[5,'number']

在第二个示例中,您所说的是按相反的顺序选择从第一个到第三个的所有项目。按相反的顺序,从
5
开始,列表中的第三项是
'number'
,但由于您只说了第三项,所以就到此为止

由于您为
stop
指定了一个正值,它将是从左到右的方向,因此在您的情况下,第三个元素的顺序是正确的


还要注意的是,在python
列表中[start:stop]
相当于
[start:stop)
,第一个元素被认为不包括右边界。

数组[start:end:step]
表示从索引
开始
开始,然后在每个循环周期中添加
步骤
,如果索引变大或等于
结束
,则中断循环。如果省略
开始
,则等于0。如果省略
结束
,则将其设置为
len(数组)
。如果
start
end
为负值,则设置为
len(数组)+start
len(数组)+结束
。如果
步骤
为负,则在每个循环周期将其添加到当前索引中,但继续循环的条件是
当前索引>结束
,而不是
当前索引<结束
,当
步骤
为正时

所以
['jumbly',wumbly',number',5][:1:-1]
意味着开始从索引
len(数组)
到索引
1
(不包括)-因此我们得到了项目
['number',5]

>>> ['jumbly', 'wumbly', 'number', 5][:1:-1]
>>> [5, 'number']
>>> ['jumbly', 'wumbly', 'number', 5][:2:-1]
>>> [5]
['jumbly',wumbly',number',5][:2:-1]
意味着开始从索引
len(数组)
到索引
2
(值
'number'
存储在索引2的列表中)(不包括)--因此我们有
[5]

>>> ['jumbly', 'wumbly', 'number', 5][:1:-1]
>>> [5, 'number']
>>> ['jumbly', 'wumbly', 'number', 5][:2:-1]
>>> [5]
或者使用以字符为索引的字符串进行更好的解释:

>>> '0123'[:1:-1]
>>> '32'

>>> '0123'[:2:-1]
>>> '3'

那么这里的逻辑是什么呢?我的意思是这个“打印(我的混乱[:2:-1])”意味着从开始到第三个元素向后打印?我非常困惑@Dhruv@Alan,
print(我的乱码[:2:-1])
无效
[0:2:-1]
试试看:
[0:2:-1]
将直接打印出来
[]
令人惊讶的解释。我现在明白了。非常感谢。@HarryLens,不客气!;)当我们能够以图形方式看到它时,事情会变得更容易理解…:)>反向切片会在切片之前先反转列表。<有文档吗?我第一次看到这个语句。@warvariuc我说的是“含蓄的”,也许我应该对此做个说明。@warvariuc好的,我更新了我的答案。。我想现在更清楚了。.“反转”是“视觉上的”而不是“实际上的”,因为它实际上是正在反转的索引