详细分析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中for循环和while循环的基本使用方法
Aug 21 Python
Python实现简易端口扫描器代码实例
Mar 15 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
Python语法分析之字符串格式化
Jun 13 Python
利用python实现周期财务统计可视化
Aug 25 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
通过实例解析python创建进程常用方法
Jun 19 Python
Django权限控制的使用
Jan 07 Python
Matplotlib animation模块实现动态图
Feb 25 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
PHP中的use关键字概述
2014/07/23 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
vue登录注册实例详解
2019/09/14 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
在python中使用nohup命令说明
2020/04/16 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
大学生职业生涯规划书汇总
2014/03/20 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2014年终工作总结范本
2014/12/15 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
施工安全保证书
2015/05/09 职场文书
React forwardRef的使用方法及注意点
2021/06/13 Javascript
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL