代码如下:
a = ""
print a[3]
执行结果如下:
这个答案是意料之中的,因为a是空字符串,取a得第四个位置,肯定是取不到,所以错误。
但问题是如果把代码改成:
a = ""
print a[3:]
结果答案则是:
执行成功,虽然没有找到答案,但是没有错误。
我想问的是,这两个区别在哪儿呢?第二段代码里面明明也是什么都找不到,为什么没有报错?
代码如下:
a = ""
print a[3]
执行结果如下:
这个答案是意料之中的,因为a是空字符串,取a得第四个位置,肯定是取不到,所以错误。
但问题是如果把代码改成:
a = ""
print a[3:]
结果答案则是:
执行成功,虽然没有找到答案,但是没有错误。
我想问的是,这两个区别在哪儿呢?第二段代码里面明明也是什么都找不到,为什么没有报错?
我想问的是,这两个区别在哪儿呢?第二段代码里面明明也是什么都找不到,为什么没有报错?
第一个是取“值”,第二个是取“切片”。
是否报错,在于方法是怎么实现的,仅此而已。
你自己也可以试试:
# -*- 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的一种方式。
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
第一个是定位第4位字符串,因为超出索引,报错
第二个是切片,切第4位字符到最后所有字符,因为切片操作属性决定,允许切不到值的,切不到也不会报错。