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 相关文章推荐
如何搜索查找并解决Django相关的问题
Jun 30 Python
使用wxPython获取系统剪贴板中的数据的教程
May 06 Python
Python 2.x如何设置命令执行的超时时间实例
Oct 19 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
python自动化报告的输出用例详解
May 30 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
Django Rest framework认证组件详细用法
Jul 25 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python魔法方法 容器部方法详解
Jan 02 Python
pytorch 实现在预训练模型的 input上增减通道
Jan 06 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
农民C键的运用技巧
2020/03/04 星际争霸
php str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
php购物车实现代码
2011/10/10 PHP
php查看当前Session的ID实例
2015/03/16 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
彻底理解Python中的yield关键字
2019/04/01 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
英国在线花园中心:You Garden
2018/06/03 全球购物
网上开店必备创业计划书
2014/01/26 职场文书
幼师自我鉴定
2014/02/01 职场文书
小学中秋节活动方案
2014/02/06 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
门店店长岗位职责
2015/04/14 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
muduo TcpServer模块源码分析
2022/04/26 Redis