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

    作者:小熊软糖
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    php 微信调用扫一扫
    JavaSE常用API
    Java中的异常处理
    Java实现多态的机制是什么?
    JavaSE(下)
    JavaSE语法(中)
    JavaSE语法
    Java面向对象
    Java零基础入门之常用工具
    Java抽象类、接口、内部类
  • 原文地址:https://www.cnblogs.com/baxiaobin/p/14435790.html
Copyright © 2011-2022 走看看