详细分析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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
50行Python代码实现人脸检测功能
Jan 23 Python
Django自定义manage命令实例代码
Feb 11 Python
Python之文字转图片方法
May 10 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
Python中logger日志模块详解
Aug 04 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
对PyTorch中inplace字段的全面理解
May 22 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Apr 21 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递归实现无限分类的方法
2015/07/28 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
python中查看变量内存地址的方法
2015/05/05 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
pycharm新建一个python工程步骤
2019/07/16 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
社团活动总结模板
2014/06/30 职场文书
岳庙导游词
2015/02/04 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
安全生产警示教育活动总结
2015/05/09 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL