【自学python】 关于索引字符串a[3]的问题

代码如下:

a = ""
print a[3]

执行结果如下:
clipboard.png
这个答案是意料之中的,因为a是空字符串,取a得第四个位置,肯定是取不到,所以错误。

但问题是如果把代码改成:

a = ""
print a[3:]

结果答案则是:

clipboard.png

执行成功,虽然没有找到答案,但是没有错误。

我想问的是,这两个区别在哪儿呢?第二段代码里面明明也是什么都找不到,为什么没有报错?

阅读 4.6k
5 个回答

第一个是定位第4位字符串,因为超出索引,报错
第二个是切片,切第4位字符到最后所有字符,因为切片操作属性决定,允许切不到值的,切不到也不会报错。

我想问的是,这两个区别在哪儿呢?第二段代码里面明明也是什么都找不到,为什么没有报错?

第一个是取“值”,第二个是取“切片”。

是否报错,在于方法是怎么实现的,仅此而已。

你自己也可以试试:

# -*- coding: utf-8 -*-

class A(object):
    def __getitem__(self, key):
        if isinstance(key, str):
            print 'i am a string'

        if isinstance(key, int):
            print 'i am a integer'

        if isinstance(key, slice):
            print 'i am a slice'


a = A()
a['x']
a[1]
a[1:]


首先,我觉得你这个问题提得挺好的。简单解释下,不一定完全正确。python中的列表其实在c实现的过程中对应的是数组,也就是说python中的列表其实就是c中的数组。a[3]数组越界很好理解,那a[3:]呢。

type(a[3:])
<class 'list'>

也就是说a[3:]返回值是一个数组。在python实现过程中,数组找不到元素的话就返回一个空值做为异常处理,其实是挺nice的一种方式。

a[3]
这是索引取值操作,索引号不能超出范围。

a[3:]
这是切片操作,是a[slice(3,None)]的简写形式。slice切片对象允许缺失或超出界限索引

第一个错误不都告诉你index out of range了么?难道你不看报错吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题