详细分析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基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
讲解Python中的标识运算符
May 14 Python
详解Python中expandtabs()方法的使用
May 18 Python
Python获取当前路径实现代码
May 08 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
超实用的 30 段 Python 案例
Oct 10 Python
如何基于python实现归一化处理
Jan 20 Python
Python实现学生管理系统(面向对象版)
Jun 24 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验证码类(分享)
2013/08/06 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
python通过线程实现定时器timer的方法
2015/03/16 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
财务会计专业毕业生自荐信
2013/10/02 职场文书
投资意向书范本
2014/04/01 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
户外拓展训练感想
2015/08/07 职场文书
python实现简单聊天功能
2021/07/07 Python