详细分析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中easy_install 和 pip 的安装及使用
Jun 05 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
对python添加模块路径的三种方法总结
Oct 16 Python
python实现三次样条插值
Dec 17 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
python实现串口通信的示例代码
Feb 10 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
python递归函数用法详解
Oct 26 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
Date对象格式化函数代码
2010/07/17 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
js插件Jcrop自定义截取图片功能
2016/10/14 Javascript
js初始化验证实例详解
2016/11/26 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python中的zip函数使用示例
2015/01/29 Python
Python使用chardet判断字符编码
2015/05/09 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
Python3常见函数range()用法详解
2019/12/30 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
servlet面试题
2012/08/20 面试题
优秀中专生推荐信
2013/11/17 职场文书
医药营销个人求职信
2014/04/12 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
python实现MD5进行文件去重的示例代码
2021/07/09 Python
Redis全局ID生成器的实现
2022/06/05 Redis