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实现的希尔排序算法实例
Jul 01 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
Mar 15 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
Python tkinter模版代码实例
Feb 05 Python
Python集合操作方法详解
Feb 09 Python
python绘制动态曲线教程
Feb 24 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
Python 如何实现文件自动去重
Jun 02 Python
C站最全Python标准库总结,你想要的都在这里
Jul 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实现邮件群发的源码
2013/06/18 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
smarty表格换行实例
2014/12/15 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
[01:22:10]Ti4 循环赛第二日 DK vs Empire
2014/07/11 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
python实现猜单词游戏
2020/05/22 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
情侣吵架检讨书
2014/02/05 职场文书
意向书范文
2014/03/31 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
行政司机岗位职责
2015/04/10 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
详解nginx location指令
2022/01/18 Servers