一道问题引出的python中可变数据类型与不可变数据类型
一. 问题的提出
我们先来看两个对比
第一道题,当对象为整数时,最终结果:b = 2, a = 1,b的变化没有引起a的变化
a = 1 b = a b += 1 print(a) print(b) 结果: 1 2
第二道题,当对象为字典时,最终结果:a = {"name":"jack","age":27}, b = {"name":"jack","age":27},b的变化引起了a的变化
a = {"name": "Jack"}
b = a
b["age"] = 27
print(a)
print(b)
结果:
{"name":"Jack","age":27}
{"name":"Jack","age":27}
那么,为什么上述两道题的结果会有如此大的区别呢?我们就来了解一下可变数据类型和不变数据类型
二. 可变数据类型和不可变数据类型
- 可变数据类型有:列表list、字典dict
- 不可变数据类型有:整型int、浮点型float、字符串string和元组tuple
python中有一个id()函数,可用来获取对象的内存地址,我们针对第一题,可以看一下a和b指向的对象的内存地址有什么变化
>>> a = 1 >>> b = a >>> id(a) 1814284368 >>> id(b) 1814284368 >>> b += 1 >>> id(b) 1814284400 >>> id(a) 1814284368 >>>
我们可以清晰的看到,a = 1, b = a,这两个操作中,变量a和b指向的对象的内存地址是一样的,也就是说a和b其实引用了同一个对象1。那为什么整型是不可变数据类型呢?这里可以理解为a和b的引用地址处的值是不能被改变的,也就是1814284368地址处的值在没被垃圾回收之前一直是1,不能改变,如果把b赋值为2,那么,只能把b的引用地址从1814284368变为1814284400,相当于b += 1这个赋值又创建了一个新的对象2,然后变量a仍然指向对象1,而变量b指向了对象2,变量b的变化并不会引起a的改变,因为它们指向的是不同的对象
我们大概画个演示图:
图一:a = 1, b = a

图二: b += 1

我们再来看字典,先用id()看一下内存地址的变化
>>> a = {"name": "Jack"}
>>> b = a
>>> id(a)
59071624
>>> id(b)
59071624
>>> b["age"] = 27
>>> id(a)
59071624
>>> id(b)
59071624
>>> a
{'age': 27, 'name': 'Jack'}
>>> b
{'age': 27, 'name': 'Jack'}
可以看到,变量a和b同时指向一个字典对象,当给变量b指向的字典添加元素后,b指向的字典的内存地址并不会发生变化,也就是说,对b的操作不会改变a引用的地址值,相当于同样一个地址得到了扩充,由于a和b指向同一个地址,所以b的变化会引起a的变化
图一:a = {"name": "Jack"}, b = a

图二:b["age"] = 27

三. 参考文章
https://blog.csdn.net/dan15188387481/article/details/49864613
一道问题引出的python中可变数据类型与不可变数据类型的更多相关文章
- 简单谈谈Python中的几种常见的数据类型
简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...
- Python中函数的参数传递与可变长参数
转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...
- Python中比较特殊的几种数据类型list、tuple、dict、set
list list(列表)是Python内置的一种数据类型,它是一种有序.可变的集合,可以随时添加和删除其中的元素. >>> classmates = ['Li', 'Tom', ' ...
- python中的引用传递,可变对象,不可变对象,list注意点
python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...
- python中 使用join()方法 对各种数据类型中元的素进行合并拼接
"连接符".join(列表或元组或字符串或字典) 返回的是一个使用连接符进行拼接的字符串 如果对象是列表,元组,就是以一个下标元素为单位进行拼接 如果对象是字符串,就是一个单词元素 ...
- Python中的几种数据类型
大体上把Python中的数据类型分为如下几类: Number(数字) 包括int,long,float,complex String(字符串) 例如:hello,"hello" ...
- (四)Python中的“四大才子”(字符串、列表、字典、集合)
前戏:在python中把数据序列分为可变(mutable)和不可变(immutable)两种 不可变:string.int.float.tuple 特点:相同对象只是占用一个内存地址,不管有多少个变量 ...
- python中的集合
在python中,普通集合是可变数据类型 通过以下案例说明: >>> s = {1, 2, 3, 4} >>> id(s) 2108634636808 >&g ...
- python中的元组
在python中,元组是不可变类型 可通过以下案例说明: >>> c1 = ['1','2'] >>> c = (1,2,c1) >>> c (1 ...
随机推荐
- python的文件处理学习笔记
python的文件处理函数是open() 以下主要是关于这个函数的一些学习笔记 1.文件处理离不开编码 要注意的是文件打开时的编码和文件保存时的编码的统一,这样才能保证你打开的文件不会存在乱码 总结: ...
- 如何使用 Opencv dnn 模块调用 Caffe 预训练模型?
QString modelPrototxt = "D:\\Qt\\qmake\\CaffeModelTest\\caffe\\lenet.prototxt"; QString mo ...
- python列表和元组相互转换
# 将列表转化为元组 lst=[11,22,33] t=tuple(lst) print(t,type(t)) # 打印结果:(11, 22, 33) <class 'tuple'> tu ...
- kubernetes 搭建教程
http://blog.csdn.net/u011563903/article/details/71037093
- spring 编译时抱错纪录class path resource [spring/] cannot be resolved to URL because it does not exist
class path resource [spring/] cannot be resolved to URL because it does not exist; 在 pom.xml 里添加如下代码 ...
- 003-整型入栈指令(iconst、bipush、sipush、ldc)
一.概述 官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html参考地址:http://www.linmuxi.com/201 ...
- 部署Jenkins+docker集成环境
环境: 主机(mac osx)和虚拟机(Ubuntu 16.04) mac osx系统,运行Jenkins Ubuntu16.04系统,运行docker(用Ubuntu14.04镜像创建一个docke ...
- Javascript 广告浮动效果在浏览器中间N秒后移动到右下角
Javascript 广告浮动效果在浏览器中间N秒后移动到右下角 闲着无聊做了一个,本人原创...就是这个页面的广告效果....怎么样???? 刚刚学习的javascript
- vlc做转发的命令
from:http://blog.csdn.net/linyuejiang/article/details/7498482 将一个udp的多播流转发复制到http流中去 vlc udp://@239. ...
- js实现给一个数组监听
$.when.apply(null, table).done(callback); table=[]是个数组,用上$.when.apply就可以监听完成后执行callback 方法 callback就 ...