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和IPython中使用Docker
Apr 28 Python
python变量不能以数字打头详解
Jul 06 Python
Python中生成Epoch的方法
Apr 26 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
Sep 12 Python
python中有关时间日期格式转换问题
Dec 25 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
python内打印变量之%和f的实例
Feb 19 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
jupyter note 实现将数据保存为word
Apr 14 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python  序列化反序列化和异常处理的问题小结
Dec 24 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模拟登陆的实现方法分析
2015/01/09 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
js表头排序实现方法
2015/01/16 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
ant design实现圈选功能
2019/12/17 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
python删除列表中重复记录的方法
2015/04/28 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
django和flask哪个值得研究学习
2020/07/31 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
语文教育专业推荐信范文
2013/11/25 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
招聘单位介绍信
2014/01/14 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
父亲节感言
2015/08/03 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL