奇怪的知识增加了,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在内存里面是怎么存储的,指针具体是怎么指向的。

posted @ 2021-02-23 14:22  采姑娘地小蘑菇  阅读(78)  评论(0编辑  收藏  举报