Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 当我在切片时使用大于len(字符串)的索引数时,为什么没有索引器?_String_Python 3.x_Slice_Index Error - Fatal编程技术网

String 当我在切片时使用大于len(字符串)的索引数时,为什么没有索引器?

String 当我在切片时使用大于len(字符串)的索引数时,为什么没有索引器?,string,python-3.x,slice,index-error,String,Python 3.x,Slice,Index Error,当我使用大于字符串长度的索引号时,我在Python中正确地得到了一个索引器,例如: string = "uphill" print(string[12]) 但是,如果我对字符串进行切片,似乎可以使用比字符串大的索引号,因为以下代码不会创建索引器: string = "uphill" print(string[0:12]) 为什么会这样?这对我来说似乎相当含蓄,因为我希望在本例中也有一个索引器。如果这很明显,我很抱歉,但我找不到任何相关的 在python 3.x中,字符串索引错误仅针对单个

当我使用大于字符串长度的索引号时,我在Python中正确地得到了一个索引器,例如:

string = "uphill"  
print(string[12])
但是,如果我对字符串进行切片,似乎可以使用比字符串大的索引号,因为以下代码不会创建索引器:

string = "uphill"
print(string[0:12])

为什么会这样?这对我来说似乎相当含蓄,因为我希望在本例中也有一个索引器。如果这很明显,我很抱歉,但我找不到任何相关的

在python 3.x中,字符串索引错误仅针对单个索引给出。 前-

您将在此处获得字符串索引超出范围错误。因为它是针对特定索引的

但在切片中,我们可以指定超出范围的索引,而不会给出错误。 前- string=“上坡” 打印(字符串[0:])


Python打印范围内的字符。要给出错误,用户必须知道字符串的长度。为此,您可以使用len()函数。

我在本文中找到了对这个问题的一个很好的解释:

注意:下面的答案来自文章,不是我写的

"

如果您请求超出序列边界的单个索引,则可能会出现IndexError异常。但是切片不会出现这种问题;它们只会停在字符串的开头或结尾……方括号如何区分单个索引和切片?答案是:它们不会。在这两种情况下,getitem方法正在被调用。由getitem检查它为“index”参数得到了什么样的值

但是等一下:如果我们将一个整数或字符串(甚至一个元组)传递给方括号,我们知道将传递什么类型。如果我们使用切片,将传递什么类型给我们的方法

In [55]: class Foo(object):
...:         def __getitem__(self, index):
...:             print(f"index = {index}, type(index) = {type(index)}")
...:


In [56]: f = Foo()

In [57]: f[100]
index = 100, type(index) = <class 'int'>

In [58]: f[5:100]
index = slice(5, 100, None), type(index) = <class 'slice'>

In [59]: f[5:100:3]
index = slice(5, 100, 3), type(index) = <class 'slice'>
[55]中的
:类Foo(对象):
…:def uu getitem uuu(self,index):
…:打印(f“index={index},type(index)={type(index)}”)
...:
在[56]中:f=Foo()
In[57]:f[100]
索引=100,类型(索引)=
In[58]:f[5:100]
索引=切片(5100,无),类型(索引)=
In[59]:f[5:100:3]
索引=切片(51003),类型(索引)=
请注意,在第一种情况下,正如预期的那样,我们得到了一个整数。但是在第二种和第三种情况下,我们得到了一个切片对象。如果需要,我们可以手动创建这些对象;“slice”位于“bulitin”命名空间中,以及str、int、dict和其他收藏夹。从它的打印表示中可以看到,我们可以称之为“slice”就像我们使用“范围”一样,使用start、stop和step size参数

In [55]: class Foo(object):
...:         def __getitem__(self, index):
...:             print(f"index = {index}, type(index) = {type(index)}")
...:


In [56]: f = Foo()

In [57]: f[100]
index = 100, type(index) = <class 'int'>

In [58]: f[5:100]
index = slice(5, 100, None), type(index) = <class 'slice'>

In [59]: f[5:100:3]
index = slice(5, 100, 3), type(index) = <class 'slice'>