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微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
Python简单计算文件MD5值的方法示例
Apr 11 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
详解django中url路由配置及渲染方式
Feb 25 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
python实现飞船大战
Apr 24 Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 Python
深入了解Python装饰器的高级用法
Aug 13 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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使用正则表达式清除超链接文本
2013/11/12 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
PDO::errorCode讲解
2019/01/28 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
初识Node.js
2015/03/20 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
bootstrap table实例详解
2017/01/06 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
Python中的默认参数实例分析
2018/01/29 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
小学生班会演讲稿
2014/01/09 职场文书
结对共建工作方案
2014/06/02 职场文书
幼儿老师求职信
2014/06/30 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
毕业证代领委托书
2014/09/26 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书