可变与不可变类型

1、可变与不可变类型

1)学python,一定要记住“一切皆为对象,一切皆为对象的引用”;

2)所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变;

3)可变数据类型:value值改变,id值不变;不可变数据类型:value值改变,id值也随之改变。

注:即id不变时,value可以改变则为可变数据类型,value不可以改变则为不可变数据类型。

4)不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)

i = 3 (被垃圾回收)

i = 3 + 1 (实际 i = 4)

从而可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。

如图所示,因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址。

优点:可以减少重复的值对内存空间的占用。

缺点:如上图所示,修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这会给执行效率带来一定的降低。

5)可变(mutable):字典型(dictionary)、列表型(list)

2、如何确定一种数据类型是可变的还是不可变的:

根据可变数据类型与不可变数据类型的概念,只需要在改变value值的同时,使用id()函数查看变量id值是否变化,就可以知道这种数据类型是可变的还是不可变的了。

1)数字

数字:从图中可以看出当数字的值改变时,变量id值也改变了,所以数字是不可变数;

python中为了减少开辟内存造成的时间开销,对于三位内的整型数字类型数据,在开辟一块内存空间后,后面的三位内的整型数据都放到这个内存空间中,所以三位以内的整型数字类型的id值都是相同的。

2)字符串

从图中可以看出当字符串的值改变时,变量id值也改变了,所以字符串是不可变数据类型;

3)布尔

从图中可以看出当布尔的值改变时,变量id值也改变了,所以布尔值是不可变数据类型

3)元祖

因为元祖元素是不可修改的,所以元祖是不可变数据类型

4)列表

从图中可以看出,当列表中的某个元素改变时,列表的id值没有改变,所以列表是可变数据类型;

5)字典

从图中可以看出,当字典的键值对的value部分改变时,字典的id值没有改变,所以字典是可变数据类型

转载自:https://www.cnblogs.com/xxtalhr/p/9049188.html

我的博客园:https://www.cnblogs.com/yyl102

我的CSDN:https://blog.csdn.net/weixin_43992198

原文地址:https://www.cnblogs.com/yyl102/p/10799800.html

时间: 2024-11-09 02:55:45

可变与不可变类型的相关文章

[Guava学习笔记]Collections: 不可变集合, 新集合类型

不可变集合 不接受null值. 创建:ImmutableSet.copyOf(set); ImmutableMap.of(“a”, 1, “b”, 2); public static final ImmutableSet<Color> GOOGLE_COLORS = ImmutableSet.<Color>builder() .addAll(WEBSAFE_COLORS) .add(new Color(0, 191, 255)) .build(); 可以有序(如ImmutableS

通过char与varchar的区别,学习可变长的字符类型

转自http://www.uphtm.com/database/232.html 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 char (16)长度固定, 如'www.uphtm.com' 存储需要空间 14个字符 varchar(16) 可变长 如'www.uphtm.com' 需要存储空间 15字符, 从上面可以看得出来char 长度是固定

while循环,布尔类型,可变or不可变,数字,字符串,列表,元组,字典

while 循环 '''1.什么是循环? 循环即重复的过程 2.为什么要有循环 3.while循环的语法(又称之为条件循环) while 条件: 代码1 代码2 代码3 .... ''' # 注意:下述形式的死循环,会造成cpu的占用率过高# i=1# while True:# i+=1 #打印1-10# n=1# while True:# if n <= 10: #n=10# print(n)# n+=1# else:# break #打印1-10:改进1# n=1# while True:#

python —— 可变与不可变类型

可变与不可变类型对象 可变和不可变,本质上就是改变了里面的数据后,内存地址是否有改变 可变类型.不可hash 不可变类型,可hash 列表 字符串 字典 数字 集合 元组   不可变的集合 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. 可变对象,该对象所指向的内存中的值可以被改变.变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并

python可变和不可变类型

时长总结一下Python基础知识,动手写一写不容易忘记 * Python的数据类型可以分为可变与不可变类型两大类 可变类型:列表 ,字典 不可变类型:数值,字符,元组 * 对不可变类型进行赋值的时候其实是创建了一个新的不可变对象,并将指向原来不可变对象的变量指向这个新的不可变对象,这个时候原来的不可变对象就失去了指向它的变量 ,如果没有新的变量指向它的话,这个不可变对象就会被回收 eg: 1 i=1 2 i+=1 3 i 4 2 实际上此处的i+=1并不是真的在原来的int对象上进行加1,而是重

python 深拷贝和浅拷贝之可变和不可变对象总结

了解深拷贝和浅拷贝之前先要理解可变与不可变对象 python只允许使用引用传递,有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float,tuple Python int,string,float,tuple不可变举栗子: def int_object(): i = 89 j = 89 print(id(89)) print('i id:' + str(id(i))) print('j id:' + str(id(j))) print(i is j)

关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/不可变对象: 4.Objective-C中的copy与mutableCopy方法. 一.指针与对象 在初始学习编程的时候,对于绝大多数面向对象编程的语言,这都是个绕不开的重点与难点.非常惭愧的是对它的认识我一直是不够的,并且感觉这项技术有许多的内容可以挖掘.说这是面向对象编程的核心思想也不为过.很多

python中的可变与不可变对象

Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. 可变对象,该对象所指向的内存中的值可以被改变.变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变. Python中,数值类型(int和float).字符串str.元组tuple都是不可变类

可变于不可变对象分类

Python在heap中分配的对象分成两类: 可变对象和不可变对象. 所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变. 可变即内存空间可变,不可变即内存空间不可变.这里用 id 函数看对象的内存地址有没有变化. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list) 如不可变类型例子:  id不变,type不变,值也不变. 从上图可以看出:变