详细分析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常见数制转换实例分析
May 09 Python
Python变量和数据类型详解
Feb 15 Python
Python 多核并行计算的示例代码
Nov 07 Python
python中Switch/Case实现的示例代码
Nov 09 Python
python判断输入日期为第几天的实例
Nov 13 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
Python reversed函数及使用方法解析
Mar 17 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Python加载数据的5种不同方式(收藏)
Nov 13 Python
Python爬虫新手入门之初学lxml库
Dec 20 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树的代码,可以嵌套任意层
2006/10/09 PHP
基于qmail的完整WEBMAIL解决方案安装详解
2006/10/09 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
JavaScript省市联动实现代码
2014/02/15 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
一个超级简单的python web程序
2014/09/11 Python
python进程管理工具supervisor使用实例
2014/09/17 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
Python如何实现线程间通信
2020/07/30 Python
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
夜班门卫岗位职责
2013/12/09 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
装修施工安全责任书
2014/07/24 职场文书
学用政策心得体会
2014/09/10 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
青岛导游词
2015/02/12 职场文书
项目验收申请报告
2015/05/15 职场文书
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang