Python 使用单词[1:2]而不仅仅是单词[1]?

Python 使用单词[1:2]而不仅仅是单词[1]?,python,string,slice,Python,String,Slice,我在Python教科书中遇到了一个例子,它使用word[1:2]对字符串进行切片。它这样做是为了证明只有一个字母的字符串将被切片 这让我想到了——有没有一种用例可以使用word[1:2]而不仅仅是返回相同结果的word[1](即,“字符”和一个字符长的字符串之间没有区别) 对于其他可滑动对象(例如列表),两者可能不等效: >>> word = ['a', 's', 'd', 'f'] >>> word[1:2] ['s'] >>> word[

我在Python教科书中遇到了一个例子,它使用
word[1:2]
对字符串进行切片。它这样做是为了证明只有一个字母的字符串将被切片


这让我想到了——有没有一种用例可以使用
word[1:2]
而不仅仅是返回相同结果的
word[1]
(即,“字符”和一个字符长的字符串之间没有区别)

对于其他可滑动对象(例如列表),两者可能不等效:

>>> word = ['a', 's', 'd', 'f']
>>> word[1:2]
['s']
>>> word[1]
's'

不成文的规则是,切片将返回一个子序列,订阅将返回一个元素。恰好对于长度为1的字符串,这些概念是相等的。但有一个微妙的API差异:切片字符串不能抛出
索引器

>>> s = "x"
>>> s[1:2]
''
>>> s[1]
IndexError: string index out of range
在某些罕见的情况下,当您希望进行检查并避免出现非故意异常的可能性时,这非常方便/有用

这里也许还值得一提:ByTestRing有一个更显著的区别,对于ByTestRing,再次切片返回子字符串,但订阅返回序号


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


你没问这个吗?总的来说,它们的结果不一样。事实上,考虑到你似乎已经从一个列表变成了一个字符串,这可能正是教科书试图教你的东西。@PraysonW.Daniel它们不是。一个会引发一个索引器,而另一个不会。另外,如果
word
会是一个列表,那么一个会被重新命名在另一个不会的情况下打开一个列表。对不起,我删除了我的第一条注释。我想说它们在切片len(string)>1的字符串时是一样的,但在切片列表时不是。对于string string[N]==string[N:N+1],列表不是这样的,因为list为list[N]返回N_值,而list为list[N:N+1]即[N]有一点不同。
'[1]
会引发一个
索引器
,而
'[1:2]
会返回一个空字符串。是的;我假设您正在访问一个有效的索引(而且该对象首先是可滑动的)。“…对字符串进行切片”对列表进行切片。不管它是字符串还是整数,它是什么?切片应用于容器,而不是元素。我只考虑字符串(列表、dict等在这里不在范围内)Python
bytes
对象绝对不是字符串(至少在Python 3中不是这样)!
>>> s = "x"
>>> s[1:2]
''
>>> s[1]
IndexError: string index out of range
>>> b'xyz'[1]
121
>>> b'xyz'[1:2]
b'y'
word = ['a', 'b', 'c']
print(word[1])
#output: b
#but also
print(word[1:2])
#output: ['b']