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 正则表达式操作指南
May 04 Python
Fiddler如何抓取手机APP数据包
Jan 22 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
Golang与python线程详解及简单实例
Apr 27 Python
python3操作mysql数据库的方法
Jun 23 Python
python保存网页图片到本地的方法
Jul 24 Python
python实现顺时针打印矩阵
Mar 02 Python
Python中@property的理解和使用示例
Jun 11 Python
Python Selenium 设置元素等待的三种方式
Mar 18 Python
python不同系统中打开方法
Jun 23 Python
详细介绍python类及类的用法
May 31 Python
分享提高 Python 代码的可读性的技巧
Mar 03 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应用提速面面观
2006/10/09 PHP
php统计文章排行示例
2014/03/04 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
php集成动态口令认证
2016/07/21 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
Python对数据库操作
2016/03/28 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python组合无重复三位数的实例
2018/11/13 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
区分python中的进程与线程
2020/08/13 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
员工年终演讲稿
2014/01/03 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
镇创先争优活动总结
2014/08/28 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python