详细分析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程序中访问Java类的简单示例
Apr 20 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
Python 迭代器与生成器实例详解
May 18 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
Python 抓取数据存储到Redis中的操作
Jul 16 Python
python 线程的五个状态
Sep 22 Python
python使用ctypes库调用DLL动态链接库
Oct 22 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
用php过滤危险html代码的函数
2008/07/22 PHP
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
理解AngularJs指令
2015/12/10 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
python批量修改文件编码格式的方法
2018/05/31 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
C#可否对内存进行直接的操作
2015/02/26 面试题
会计电算化专业毕业生推荐信
2013/12/24 职场文书
安全生产检讨书
2014/01/21 职场文书
农贸市场管理制度
2014/01/31 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
平面设计专业求职信
2014/08/09 职场文书
高中运动会广播稿
2014/09/16 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
学生个人评语大全
2015/01/04 职场文书
三行辞职书范文
2015/02/26 职场文书