奇怪的知识增加了,python切片特点以及下标的活用,可变tuple
今天在做一个练习,发现一个有趣的现象,python中定义一个空的list s=‘’,那么s[0]是越界的,因为没有s[0]这个元素,但是s[:1]是合法的,甚至s[:2],s[:3]这些都是合法的
首先区别一下几个东西吧
s=[]
s[0] 取首个元素,s没有首个元素,会报索引越界异常
s[0:] 取从第零个元素之后的所有元素,我理解的是s为空,所以第0个元素没有,之后的元素自然也没有,所以结果为:'',合理合法吧(强行解释)
s[:0] 取第0个元素之前的所有元素,依旧这么理解:s为空,所以第0个元素没有,之前的元素自然也没有,结果为:'',合理合法!
s[:1] 取第第一个元素之前的所有元素,还是这么理解:s为空,所以第1个元素没有,之前的元素自然也没有,结果为:'',合理合法!
s[0:1] 取第0个到第1个元素,s为空,所以第0个到第1个的结果为‘’,合理合法!
总结:当取list具体某个值时,不可以出现索引越界的情况,但是当使用切片的方式取值时,就不担心越界问题了,甚至可以无限越界,这就像是,你夸一个眼睛不好看的妹子,你说你眼睛真好看啊,那妹子心想你这人太假了。但是你要是说,你今天从头到脚都好漂亮啊,那妹子心里就会比较容易接受你的赞美。甚至你夸张一点,你说你的出现让周围空气都变好看了(明显的越界),但是那妹子也不会拆穿你。
顺便牢固一下另一个只是,我们知道tuple是不可变的,一旦定义,就无法修改,但是却有一种方法是可以修改tuple的
l = (a,b,c,[x,y])
这个tuple中包含了一个list[x,y]
这时候如果我们这么操作:
l[3][0]=d
l[3][1]=e
print(l)
我们会发现,神奇的事出现了,tuple l居然被修改了,xy变成了de。聪明的人应该已经隐隐发现了什么,这不是投机取巧,你虽然表面上说操作的tuple,但是实际修改的是list的值啊,这里就又要说道指针相关了,当你操作l[3]的时候,是在修改tuple的内容,但是当你操作l[3][0]的时候,实际是在修改list的内容,是允许的。所以本质的tuple是没有修改的,你只是修改了list,这是典型的偷换概念。
这里其实需要思考一下,这个l在内存里面是怎么存储的,指针具体是怎么指向的。