使用word[1:2]而不是只用word[1]有什么区别?

4

我在一本Python教材中遇到了一个示例,它使用word[1:2]来切片字符串。它这样做是为了演示只有字符串的一个字母被切片。

这让我想到 - 是否有用例可以使用word[1:2]而不是仅仅使用word[1],因为它们返回相同的结果?


1
你不是已经问过这个问题了吗?一般来说,它们的结果并不相同。实际上,考虑到你似乎已经从列表转换为字符串,这可能正是教科书试图教授给你的内容。 - jonrsharpe
2
@PraysonW.Daniel 它们不同。一个会引发索引错误,而另一个则不会。此外,如果 word 是一个列表,那么一个将返回一个列表,而另一个则不会。 - DeepSpace
抱歉,我删除了我的第一条评论。我想说的是,当切片字符串时,如果len(string)>1,则它们是相同的,但在切片列表时不是。对于字符串string[N] == string[N:N+1],但对于列表来说情况并非如此,因为list_ [N]返回N_value,而当list_ [N:N + 1]即[N]时,列表具有value_N。 - Prayson W. Daniel
3个回答

5
未明确规定的规则是,切片操作将返回一个子序列,而引用操作将返回一个元素。只不过对于长度为一的字符串来说,这些概念是相等的。但是有一个微妙的API差异:切片字符串不能抛出IndexError异常。
>>> s = "x"
>>> s[1:2]
''
>>> s[1]
IndexError: string index out of range

在某些罕见的情况下,当您想进行检查并避免未处理的异常可能性时,这可能很方便/有用。
也许在这里值得一提的是:对于字节串,存在更显著的差异,其中切片再次返回子串,但订阅返回ordinals。
>>> b'xyz'[1]
121
>>> b'xyz'[1:2]
b'y'

我只关注于字符串的答案(列表、字典等不在此范围内)。 - wim
1
Python中的“bytes”对象绝对不是字符串(至少在Python 3中不是)! - Samwise

1
假设您使用的是有效的索引,对于字符串切片来说没有区别,因为字符串的单个元素仍然是一个字符串(即“字符”和长度为1的字符串之间没有区别)。
>>> word = 'asdf'
>>> word[1:2]
's'
>>> word[1]
's'

对于其他可切片的对象(例如列表),这两者可能不等价:
>>> word = ['a', 's', 'd', 'f']
>>> word[1:2]
['s']
>>> word[1]
's'

2
有一个小差别。''[1] 会引发 IndexError,而 ''[1:2] 则返回一个空字符串。 - DeepSpace
1
真的;我假设您正在访问有效的索引(并且该对象首先是可切片的)。 - Samwise

0

word[1]word[1:2]是不同的。 word[1]返回索引为1的列表项的值。但word[1:2]是一个列表切片,它返回位置为1的列表。

例子:
word = ['a', 'b', 'c']
print(word[1])
#output: b
#but also
print(word[1:2])
#output: ['b']

"...对于字符串进行切片" - jonrsharpe
切片列表,无论是字符串还是整数。 - Dejene T.
1
什么?切片应用于容器,而不是元素 - jonrsharpe

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