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在内存里面是怎么存储的,指针具体是怎么指向的。

    作者:小熊软糖
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    深入了解 JavaScript 中的 for 循环
    JavaScript 字符串常用操作
    10个习惯助你成为一名优秀的程序员
    Ubuntu日常问题搜集和解决办法
    提升你的开发效率,10 个 NPM 使用技巧
    Redux教程3:添加倒计时
    Redux教程2:链接React
    Redux教程1:环境搭建,初写Redux
    React + Redux 入坑指南
    12个非常实用的JavaScript小技巧
  • 原文地址:https://www.cnblogs.com/baxiaobin/p/14435790.html
Copyright © 2011-2022 走看看