详细分析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神器对付12306变态验证码
Jan 05 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
轻松理解Python 中的 descriptor
Sep 15 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python 对字典按照value进行排序的方法
May 09 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
pytorch模型存储的2种实现方法
Feb 14 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
Mar 04 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
一篇不错的PHP基础学习笔记
2007/03/18 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
jquery的键盘事件修改代码
2011/02/24 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
Node.js模块加载详解
2014/08/16 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
对python中的pop函数和append函数详解
2018/05/04 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
Python如何读取、写入CSV数据
2020/07/28 Python
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
国贸专业的职业规划范文
2014/01/23 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android