如何理解在数据类型中元素不能修改?

我所理解的元素修改是:
不能对已经赋值或者初始化的数据类型进行元素的修改,这里的修改不是指片面意思上的输错了数值,将光标移到对应位置,按下删除键,再进行数据的修改等操作,也不是指对对象的重新赋值。

重新赋值:初始化完成后又进行重新赋值
修改:创建后对象后对某些元素进行添加、删除等操作

  • 例如Python中字符串不能被改变,word=[‘abcdefgh’],如果运行word[0] = 'm’会导致错误==‘str’ object does not support item assignment.==
    关于字符串原码详细的信息,可以查看https://zhuanlan.zhihu.com/p/120980114

变长可变对象 - 例如 List,创建后还能添加、删除元素
变长不可变对象 - 例如 String,Tuple, 创建后,不再支持添加、删除等操作

word = 'abcdefgh'
word[0] = 'm'
print(word)

  • List(列表)可以完成大多数集合类的数据结构实现,元素类型可以不相同,列表的元素可以修改。。
a = [0,1,2,3,4,5,6,7,8,9]
a[2:5] = [11,11,11]
print(a)

  • Tuple(元组)与列表类似,但是元组的元素不能修改
tuple = ('abc',123,3.14,'kim')
tuple[0] = 'love'print(tuple)

在Java语言中,菜鸟教程中解析了String类不可改变的实例。简单来说:String类利用了final修饰的char类型数组存储字符。字符串的本质是字符数组,value属性用来存放字符串中的字符,final属性修饰,是不可被修改的。
以下内容来源https://www.cnblogs.com/Java-JJ/p/12625888.html

String不可变但不代表引用不可以变

String str = “Hello”;
str = str + " World";
System.out.println(“str=” + str);
结果:

str=Hello World
解析:

实际上,原来String的内容是不变的,只是str由原来指向"Hello"的内存地址转为指向"Hello World"的内存地址而已,也就是说多开辟了一块内存区域给"Hello World"字符串。

通过反射是可以修改所谓的“不可变”对象
// 创建字符串"Hello World", 并赋给引用s
String s = “Hello World”;

System.out.println("s = " + s); // Hello World

// 获取String类中的value字段
Field valueFieldOfString = String.class.getDeclaredField(“value”);

// 改变value属性的访问权限
valueFieldOfString.setAccessible(true);

// 获取s对象上的value属性的值
char[] value = (char[]) valueFieldOfString.get(s);

// 改变value所引用的数组中的第5个字符
value[5] = ‘_’;

System.out.println("s = " + s); // Hello_World
结果:

s = Hello World
s = Hello_World
解析:

用反射可以访问私有成员, 然后反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。

是否可以继承 String 类
String 类是 final 类,不可以被继承。

重新赋值的“背后”

  • 对于String类对象重新赋值

执行代码:

public class Text01 {public static void main(String[] args) {String s = "Google";System.out.println("s = " + s);s = "Runobb";System.out.println("s = " + s);}
}

得到的结果:

s = Google
s = Runobb

两次输出字符串string的结果看似是改变了,但是第一次赋值的“Google”还存放在内存中。

原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = “Runoob”; 创建了一个新的对象 “Runoob”,而原来的 “Google” 还存在于内存中。

Java虚拟机中,栈(stack)中分配的是基本数据类型和自定义对象的引用。堆(heap)中分配的是对象,创建new的对象。方法区中存放的是类的信息、static变量、常量。当执行 s = "Runoob"时,对象 s 指向栈中新的引用“Runoob”。所以s的结果看似改变,实则是和栈中另外的值手牵手了,而旧相好"Google"还在栈中原来的地方静静等待着。所以说String对象是不可变的,"Google"还在原来的地方,没有任何改变。


以上是自己在学习过程中对于数据类型的元素是否可以被修改的理解,如果哪里有错误,还请提醒一下。

如何理解在数据类型中元素不能修改?相关推荐

  1. python中的数据类型有哪些是可阅读,Python中典型的数据类型中哪个只能阅读不能修改...

    Python中典型的数据类型中哪个只能阅读不能修改 更多相关问题 传递窗 由( ).( ).( ) .( ).( ).( ).( )组成. 在网络计划中可以有一个以上终点节点(1.0分) 集成运放的类 ...

  2. python3 将列表中元素转化为字典_软件测试学Python(七):Python中的变量和标准数据类型...

    上一篇文章中,凯哥给大家介绍了Python中的常量(字面值). 测试凯哥:软件测试学Python(六):Python中的常量​zhuanlan.zhihu.com 在这篇文章中,凯哥带各位学习测试的知 ...

  3. python基础教程:修改Python列表中元素的几种方法

    一.在for循环中直接更改列表中元素的值不会起作用: 如: l = list(range(10)[::2]) print (l) for n in l: n = 0 print (l) 运行结果: [ ...

  4. B09_NumPy迭代数组(控制遍历顺序,修改数组中元素的值,使用外部循环,广播迭代)

    NumPy迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用arange()函数 ...

  5. Java语言程序设计 上机实验2 掌握Java的基本语言成分和流程控制语句。 掌握Java中数组的使用,理解引用数据类型。 掌握String类的使用。...

      Java语言程序设计 上机实验2 实验目的: 掌握Java的基本语言成分和流程控制语句. 掌握Java中数组的使用,理解引用数据类型. 掌握String类的使用. 实验内容: 注:标(*)为选做内 ...

  6. 深圳软件测试培训:DOM中元素节点、属性节点、文本节点的理解

    深圳软件测试培训:DOM中元素节点.属性节点.文本节点的理解 节点信息 每个节点都拥有包含着关于节点某些信息的属性.这些属性是: nodeType(节点类型) nodeName(节点名称) nodeV ...

  7. Python列表(获取列表中指定元素的索引、获取列表中的多个元素、判断指定元素是否在列表中存在、列表元素的遍历、列表元素的增加操作、 列表元素的删除操作、列表元素的修改操作、列表元素的排序操作)

    1.获取列表中指定元素的索引 eg1:未指定索引范围查找索引 zyr=['憨憨','憨宝'] print(zyr.index('憨宝')) print(zyr[1]) eg2:在指定索引范围内查找元素 ...

  8. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,终于把心中的疑惑彻底解开了.现在记录下我对指针声明的理解,顺便说下如何在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  9. python函数调用时所提供的参数可以是常量_元组的元素不能修改,一般作为参数传递给函数调用,或是从函数调用除获得参数时,保护其内容不被外部接口修改和破坏。( )_学小易找答案...

    [单选题]设 且 存在,则 ________ [单选题]下列论断中,( )是准确的 [单选题]当常数 --时,曲线 与 相切 [判断题]在列表中可以嵌套另一个列表.( ) [填空题]常用的编程思想有面 ...

最新文章

  1. ASP.NET2.0轻松搞定统计图表【月儿原创】
  2. clob存base64文件存不进去_Kafka 和 RocketMQ 底层存储之那些你不知道的事
  3. mysql 游标循环_mysql for循环遍历 游标用处
  4. C语言基础-基本算法
  5. 首发:台大林轩田《机器学习基石》系列课程教材的习题解答和实现
  6. 小东《迷路的情人》MV
  7. ea连接远程oracle报错,PLSQL Developer日期格式如何定制化
  8. 杨中科的.NET 6新书的出版进度汇报
  9. java语言链栈_Java语言实现数据结构栈代码详解
  10. Windows高精度微秒级(并发)定时器实现
  11. C++/C学习笔记(十一)——存储分配器和适配器
  12. CSS 控制元素 上下左右居中
  13. 整理Java基础知识--数组2
  14. 为什么企业要做CMMI资质认证?
  15. DPDK Release 21.11
  16. 在firefox的flashgot中配置各种下载器
  17. 哥本哈根大学物理学家研制的创新芯片解决了量子难题;高通风投投资量子机器公司 | 全球量子科技与工业快讯第四十二期
  18. springboot 中的 文件、短信、邮件、token 工具类
  19. 职业与生活规划是否必要?回答因人而异。但规划至少会给人带来以下好处。
  20. 负数补码表示范围以及规格化数

热门文章

  1. LeetCode 1013. 将数组分成和相等的三个部分
  2. linux程序运行耗时shell脚本running_time.sh
  3. 人生苦短,我用Python(Python快速教程 - 基础篇)
  4. 1.NoSQL与MongoDB简介
  5. 数据标准化 - scale() - Python代码
  6. mysql行列转置-图文详解
  7. oracle杀死进程时权限不足_在oracle中创建函数时权限不足
  8. 领域应用 | 美团商品知识图谱的构建及应用
  9. 关系抽取、时间抽取,实践项目推荐
  10. 【LeetCode】3月30日打卡-Day15