python 负索引截取字符串 python字符串切片负数索引_内存空间


概述

在Python中,字符串是定义为字符的有序集合,即我们可以像使用列表一样在字符串中自由翱翔-使用索引和切片操作字符串,比如通过指定的索引获取字符串某个位置的字符。

# 示例字符串s = 'python str with slice'

索引的简单使用

在Python中字符串的索引可以是正数,正数即从左向右索引,索引从0开始,也可以是负数,负数即从右向左开始索引,索引从-1开始。如果超出了正负的索引范围,则会抛出异常

# 即从左边获取第一个偏移位置的字符print(s[0])# 即从左边获取第一个偏移位置的字符print(s[-1])# 即从左边获取第三个偏移位置的字符print(s[4])try: # 尝试不存在于s的索引 print(s[1000])except: print('IndexError: string index out of range')

示例结果:

peoIndexError: string index out of range

切片的简单使用

切片,顾名思义即将一个有序序列切出一片,即从一个完整的字符串中取出一部分字符串,而怎么取? 这就取决于我们怎么利用索引进行切片了:

s = 'python str with slice'# 获取从偏移为1,直到但不包括偏移为6的元素print(s[0:6])# 获取从偏移为7,直到但不包括偏移为10的元素print(s[7:10])# 获取从偏移为11,直到但不包括偏移为-6的元素print(s[11:-6])

示例结果:

pythonstrwith

通过上面的切片效果,我们可以看到切片的基本使用,即通过两个用冒号隔开的索引完成“切片”操作,并返回新的字符串(记住,就算只“切”了一个字符,在Python中单个字符也是作为字符串的存在,这和类C中是不一样的)

更酷一点的切片

# 示例字符串s = 'python str with slice'# 获取偏移为16直到末尾的元素,等价于获取偏移为16直到但不包括偏移为序列长度的元素print(s[16:])# 获取从偏移为0,直到但不包含偏移为11的元素print(s[:11])# 获取偏移为-5直到末尾的元素,等价于获取偏移为16直到但不包括偏移为序列长度的元素print(s[-5:])# 获取从偏移为0,直到但不包含偏移为-11的元素print(s[:-11])# 获取从偏移为0,知道末尾的元素,实现了有效的底层s复制。print(s[:])

示例效果:

slicepython strslicepython strpython str with slice

顶层赋值小技巧

对于最后一个示例,即s[:],对于可变对象的复制是很有用处的,比如列表,当我们想要复制列表时:

ls1 = [1, 2, 3, 4, 5]ls2 = ls1ls2[0] = 100print(ls1)

示例结果

[100, 2, 3, 4, 5]

我们看到运行结果,对于可变对象的复制,通过ls2 = ls1其实类似C中将指向ls1的指针赋值给ls2,即还是指向了同一内存空间,所以在操作ls2时,ls1也同时发生了变化,本质就是在操作同一内存空间

而通过s[:]可以实现新的内存分配,完整的赋值一份新的数据,使ls2指向新的内存空间:

ls1 = [1, 2, 3, 4, 5]ls2 = ls1[:]ls2[0] = 100print(ls1)

示例结果

[1, 2, 3, 4, 5]

更更酷一点的切片

在切片的使用中还可以再添加一个可选择的索引参数

python s = 'abcdefghijk' ¨K20K print(s[:11:2]) ¨K21K print(s[11::-2]) ¨K22K print(s[::-1]) ¨G11G acegik kigeca ¨G12G 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = "hello