Python 可变类型和不可变类型及引用过程解析


Posted in Python onSeptember 27, 2019

在Python中定义一个数据便在内存中开辟一片空间来存储这个变量的值,这块已经被分配的内存空间便会有一个内存地址。访问这块内存需要用到变量名,变量名实际存储的是变量的地址在内存中的地址,但是使用print()函数得到的确实这块内存中实际的地址。这个就当成规定就好,没必要纠结。

获得变量在内存中的地址,可以使用id()函数。

常规使用

变量之间的赋值其实是把一个变量的内存地址传递给另一个变量,这样两个变量便都指向内存中的同一块空间,因此这两个变量的之是相等的

a = 1
b = a
print("a:%d  b:%d" % (a,b))
print(id(a))
print(id(b))
结果:
a:1  b:1
1711072016

此时如果有第三个变量c的值与a的相等,那么c的地址与a的地址一样。这一点请大家牢记。

a = 1
c = 1
print("a:%d  c:%d" % (a,c))
print(id(a))
print(id(c))
结果:
a:1  c:1
1711072016

此时如果修改变量c的值,那么会在内存中新开辟一块内存来存储这个变量,这块新的内存地址将会赋值给c。

a = 1
c = 1
c = 2
print("a:%d  c:%d" % (a,c))
print(id(a))
print(id(c))
结果:
a:1  c:2
1711072032

基本数据类型作为函数参数

基本数据类型作为函数实参同样是这个道理。

a = 1
print(id(a))
def func(x):
  print(id(x))
  x = 2
  print(id(x))
 
func(a)
结果:
1711072016

列表、字典等高级数据类型的引用

列表字典等高级数据类型的变量名同样存储的变量的实际地址,一个列表名赋值给另一个变量,那么这两个变量便指向内存中的同一块地址。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
结果:
[1, 2, 3] [1, 2, 3]
57931896

高级数据类型在每集加载进内存的时候内存地址与上一次可能会不同。

此时如果修改list2,也会影响list1的值,但是两个变量在内存中的地址还是不变的。这一点是与基本数据类型不一样的。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
list2.append(4)
print(list1,list2)
print(id(list1),id(list2))
 
结果:
[1, 2, 3] [1, 2, 3]
43841656
[1, 2, 3, 4] [1, 2, 3, 4]
43841656

此时如果有第三个列表list3的值也是[1,2,3,4],可以推测list3的地址与list1的地址应该是一样的,但是事实并非如此。如果有第三个列表list3的值也是[1,2,3,4],相当于在内存中新开辟一块内存来存储这个值。

list1 = [1,2,3]
list2 = list1
list3 = [1,2,3]
print(list1,list2,list3)
print(id(list1),id(list2),id(list3))
结果:
[1, 2, 3] [1, 2, 3] [1, 2, 3]
16775288 16776768

可变数据类型与不可变数据类型

在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
python利用lxml读写xml格式的文件
Aug 10 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
Django实现发送邮件找回密码功能
Aug 12 Python
Python实现微信好友的数据分析
Dec 16 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
python识别验证码的思路及解决方案
Sep 13 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
linux系统下pip升级报错的解决方法
Jan 31 Python
Python中requests做接口测试的方法
May 30 Python
Python操作qml对象过程详解
Sep 26 #Python
python 字典的打印实现
Sep 26 #Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 #Python
QML使用Python的函数过程解析
Sep 26 #Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 #Python
python3多线程知识点总结
Sep 26 #Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 #Python
You might like
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Python实现把数字转换成中文
2015/06/29 Python
python使用插值法画出平滑曲线
2018/12/15 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
python是怎么被发明的
2020/06/15 Python
python开发入门——列表生成式
2020/09/03 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
英语文学专业学生的自我评价
2013/10/31 职场文书
建筑学推荐信
2013/11/03 职场文书
《老王》教学反思
2014/02/23 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
Spring Bean是如何初始化的详解
2022/03/22 Java/Android