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第八周:详解网络编程基础(socket)
Dec 14 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
详解Django 中是否使用时区的区别
Jun 14 Python
python爬虫获取新浪新闻教学
Dec 23 Python
centos 安装Python3 及对应的pip教程详解
Jun 28 Python
Python Selenium截图功能实现代码
Apr 26 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
python实现将中文日期转换为数字日期
Jul 14 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
python 调用js的四种方式
Apr 11 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 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
13个PHP函数超实用
2015/10/21 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
Python ZipFile模块详解
2013/11/01 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Django 自定义分页器的实现代码
2019/11/24 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
学生拾金不昧表扬信
2014/01/21 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
酒店开业策划方案
2014/06/02 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
公积金接收函格式
2015/01/30 职场文书
教师继续教育反思周记
2015/06/25 职场文书
党课主持词大全
2015/06/30 职场文书
Python学习之包与模块详解
2022/03/19 Python
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS