详细分析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使用reportlab画图示例(含中文汉字)
Dec 03 Python
python简单获取数组元素个数的方法
Jul 13 Python
python中的turtle库函数简单使用教程
Jul 23 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
python实发邮件实例详解
Nov 11 Python
浅析Django中关于session的使用
Dec 30 Python
python定义类self用法实例解析
Jan 22 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 Python
Selenium Webdriver元素定位的八种常用方式(小结)
Jan 13 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
如何将数据从文本导入到mysql
2006/10/09 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
改进Django中的表单的简单方法
2015/07/17 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
html5 标签
2009/07/16 HTML / CSS
计算机通信专业推荐信
2014/02/22 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
管理提升方案
2014/06/04 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
搬迁通知
2015/04/20 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python