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中zip和unzip数据的方法
May 27 Python
Python代码实现KNN算法
Dec 20 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
Dec 05 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
Python3多线程基础知识点
Feb 19 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
利用python求积分的实例
Jul 03 Python
python+tifffile之tiff文件读写方式
Jan 13 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
Python设计密码强度校验程序
Jul 30 Python
Python -m参数原理及使用方法解析
Aug 21 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中session过期时间设置及session回收机制介绍
2014/05/05 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
js有序数组的连接问题
2013/10/01 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
JavaScript中window.open用法实例详解
2015/04/15 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
更夫岗位责任制
2014/02/11 职场文书
微信营销策划方案
2014/02/24 职场文书
教师节宣传方案
2014/05/23 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
退伍军人感言
2015/08/01 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL