详细分析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的Django框架中用流响应生成CSV文件的教程
May 02 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
python构建基础的爬虫教学
Dec 23 Python
Python面向对象之类的封装操作示例
Jun 08 Python
python3 enum模块的应用实例详解
Aug 12 Python
python datetime中strptime用法详解
Aug 29 Python
python批量处理txt文件的实例代码
Jan 13 Python
python爬虫容易学吗
Jun 02 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
如何一键升级Python所有包
Nov 05 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 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
PHP4引用文件语句的对比
2006/10/09 PHP
推荐php模板技术[转]
2007/01/04 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
Js apply方法详解
2017/02/16 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
layui树形菜单动态遍历的例子
2019/09/23 Javascript
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
python交互式图形编程实例(三)
2017/11/17 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
办公室禁烟通知
2015/04/23 职场文书
催款函范本大全
2015/06/24 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
golang import自定义包方式
2021/04/29 Golang
详解Python常用的魔法方法
2021/06/03 Python
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis