详细分析Python可变对象和不可变对象


Posted in Python onJuly 09, 2020

在 Python 中一切都可以看作为对象。每个对象都有各自的 id, type 和 value。

  1. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使用 id() 去查看对象在内存中地址。
  2. type: 和 id 一样当对象呗创建之后,它的 type 也不能再被改变,type 决定了该对象所能够支持的操作
  3. value: 对象的值

一个对象可变与否就在于 value 值是否支持改变。

不可变对象

常见的不可变对象(immutable objects):

  1. Number: int, float, complex
  2. string
  3. tuple
  4. frozenset:set 的另外一种类型

让我们通过例子感受一下

例子

>>> x=1
>>> y=x
>>> id(x)==id(y)
True
>>> id(1)==id(y)
True

这里创建了两个 int 对象,并且让 x,y 指向同一个对象,然后我们试着修改一下 x,让 x+1

>>>x=x+1

这个时候 x 的 id 值和 y 的 id 以及 1 的 id 还一样吗?

>>> x=x+1
>>> id(x)==id(y)
False
>>> id(x)==id(1)
False
>>> id(1)==id(y)
True

从结果不难看出来,x 所指向的对象已经改变了,但是 1 并没有改变。这就是不可变对象,对于不可变对象来说,一旦创建之后就不允许被改变。

注意: 不可变并不严格等同绝对的不可变

>>> a=([1],2,3)
>>> id(a)
4338862696
>>> id(a[0])
4338949128
>>> a[0][0]=0
>>> id(a)
4338862696
>>> id(a[0])
4338949128

从上面的例子不难看出,我们改变了 a[0] 的值,但是并没有影响它的 id 值。一个不可变容器对象如果包含对可变对象的引用,当后者的值改变时,前者的值也会改变;但是该容器仍属于不可变对象,因为它的 id 值不会改变的。

可变对象

常见的可变对象(mutable objects):

  1. list
  2. dict
  3. set

同样的通过例子感受一下

例子

>>> c = [1,2,3]
>>> b = c
>>> id(b)==id(c)
True

创建两个 list 对象,并且让 c,d 指向同一个对象,然后我们试着修改一下 c

c[0]=4

这个时候在看一下两个对象的 id 值是否一致

>>> id(c)==id(b)
True

修改之后,c,d 仍然指向同一个对象,所以不难得出结论,对于一个可变对象来说,修改 value 值并不会对它的 id 造成任何影响

函数参数

对于可变对象和不可变对象,他们两者在函数当作参数传递的时候表现也有所不同

例子

eg0

def update_list(nums_list):
  print(f'2 id:{id(nums_list)}')
  nums_list += [10]
  print(f'3 id:{id(nums_list)}')

  
number_list = [5, 6]
print(f'1:{number_list}, id:{id(number_list)}')   
update_list(number_list)
print(f'4:{number_list}, id:{id(number_list)}')

看一下结果

1:[5, 6], id:4457707912
2 id:4457707912
3 id:4457707912
4:[5, 6, 10], id:4457707912

在看另外一个例子

eg1

def add_num(number):
  print(f'2:{id(number)}')
  number += 1
  print(f'3:{id(number)}')


num = 1
print(f'1:{num}, id:{id(num)}')   
add_num(num)
print(f'4:{num}, id:{id(num)}')

看一下结果

1:1, id:4343768416
2 id:4343768416
3 id:4343768448
4:1, id:4343768416

有其他有些文章中,上面 eg0 被称为引用传递,eg1 被称为值传递。然而在官方文档中,并没有找到有关的这两个名词的任何内容,或者这种方式并不是上述的两者任意一种。

这里的重点是:对于可变对象,在函数中的值的改变,会导致对象改变;对于不可变对象,在函数中值的改变,对其不会造成任何影响

以上就是详细分析Python可变对象和不可变对象的详细内容,更多关于Python可变对象和不可变对象的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python对小数进行除法运算的正确方法示例
Aug 25 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
Python中属性和描述符的正确使用
Aug 23 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
python实现音乐下载的统计
Jun 20 Python
在python中实现强制关闭线程的示例
Jan 22 Python
Django 静态文件配置过程详解
Jul 23 Python
python修改字典键(key)的方法
Aug 05 Python
YUV转为jpg图像的实现
Dec 09 Python
用python 绘制茎叶图和复合饼图
Feb 26 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 #Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 #Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 #Python
Python selenium模块实现定位过程解析
Jul 09 #Python
Python自动化操作实现图例绘制
Jul 09 #Python
解决pip install psycopg2出错问题
Jul 09 #Python
利用python下载scihub成文献为PDF操作
Jul 09 #Python
You might like
PHP提高编程效率的20个要点
2015/09/23 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Python类如何定义私有变量
2020/02/03 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
劳资员岗位职责
2013/11/11 职场文书
函授自我鉴定范文
2014/02/06 职场文书
商铺租赁意向书
2014/04/01 职场文书
活动总结新闻稿
2014/08/30 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
处级干部考察材料
2014/12/24 职场文书
先进个人总结范文
2015/02/15 职场文书
司机个人年终总结
2015/03/03 职场文书
投资入股协议书
2016/03/22 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
AngularJS实现多级下拉框
2022/03/25 Javascript