Python字符串索引超出范围,s [0]和s [:1]之间的差异[重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

嗨,我是Python的新手,并试图实现使用两端删除空白空间的功能。

trim_1()工作得很完美,但是在使用trim_2()时出现了这个错误:

IndexError: string index out of range 

所以s[:1]s[0]不是一回事吗?为什么s[:1]工作和s[0]不工作?有人可以对此有所了解吗?

def trim_1(s) :
    while s[:1]  == ' ':
        s= s[1:]
    while s[-1:] == ' ':
        s= s[:-1]
    return s


def trim_2(s) :
    while s[0] == ' ':
        s= s[1:]
    while s[-1] == ' ':
        s= s[:-1]
    return s
python python-3.x string slice
3个回答
1
投票

这是因为Python容忍切片的越界索引,而不能容忍列表/字符串本身的越界索引,如下所示:

>>> ''[:1] # works even though the string does not have an index 0
''
>>> ''[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

1
投票

如果您要求特定索引,那么您告诉计算机您的代码需要继续执行该值。因此,指定索引处必须有一个元素,否则您将看到错误。使用此方法时,通常先检查一下,例如:

value = None
if len(s) > 0:
    value = s[0]  # if index 0 doesn't exist, and error will be thrown

如果你要求这样的开放式“切片”,那么你告诉计算机你想要所有元素在指定的范围内。程序员需要处理可能的结果:不存在任何元素,存在1个元素,存在多个元素。

values = s[:0]  # returns variable number of elements
if len(values) == 0:
    ...
elif len(values) > 0:
    ...

两种方法都有其用途。请记住,您是程序员掌控的。这些都是您可以用来解决问题的工具。每个选项都有不同的边缘情况,您必须处理。请记住,每个方案都有一个或两个适当的数据结构。如果你使用的是不合适的,比如将对象属性放入数组而不是使用类,你会发现你的代码看起来很麻烦和丑陋。请记住一些事情。这样的东西只有在你获得更多经验时才有意义。希望有所帮助!


0
投票

你有没有尝试过 -

sentence = ' hello  apple '
sentence.strip()
© www.soinside.com 2019 - 2024. All rights reserved.