什么是Python可变对象和不可变对象

发布时间:2020-07-22 09:59:15

来源:亿速云

阅读:60

作者:Leah

这篇文章运用简单易懂的例子给大家介绍什么是Python可变对象和不可变对象,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

在 Python 中一切都可以看作为对象。每个对象都有各自的 id, type 和 value。id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使用 id() 去查看对象在内存中地址。

type: 和 id 一样当对象呗创建之后,它的 type 也不能再被改变,type 决定了该对象所能够支持的操作

value: 对象的值

一个对象可变与否就在于 value 值是否支持改变。

不可变对象

常见的不可变对象(immutable objects):Number: int, float, complex

string

tuple

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):list

dict

set

同样的通过例子感受一下

例子>>> c = [1,2,3]

>>> b = c

>>> id(b)==id(c)

True

创建两个 list 对象,并且让 c,d 指向同一个对象,然后我们试着修改一下 cc[0]=4

这个时候在看一下两个对象的 id 值是否一致>>> id(c)==id(b)

True

修改之后,c,d 仍然指向同一个对象,所以不难得出结论,对于一个可变对象来说,修改 value 值并不会对它的 id 造成任何影响

函数参数

对于可变对象和不可变对象,他们两者在函数当作参数传递的时候表现也有所不同

例子

eg0def 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

在看另外一个例子

eg1def 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可变对象和不可变对象相关推荐

  1. python中什么是可变参数_详解Python的三种可变参数

    详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...

  2. python类的构造方法名称_搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间:文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层函 ...

  3. python手写一个迭代器_搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  4. python导入文档文件_使用python-docx 如何向word中插入文件对象!python有关word的教程...

    实现python文本写入word 准备 我测试使用的Python版本2.7.10,你的版本是Python3.5的话,这里就适合了. 使用Speech API 原理 我们的想法是借软的语音接口,所以我们 ...

  5. python语法详解大全_笔记:Python 语法要点汇总

    Python 是一门解释型语言,无需编译和链接 Python 解释器 交互模式 脚本模式 源码编码 默认情况下,Python 源文件是 UTF-8 编码 指定源文件的字符编码 # -*- coding ...

  6. list python 访问 键值对_学完Python,我决定熬夜整理这篇总结...

    作者:Caso_卡索 来源:http://suo.im/5wzRqt 一.了解Python 1.Python之父 Guido Van Rossum,一位荷兰程序员,在1989年圣诞节编写了Pyhon语 ...

  7. python将字符串逆序_为什么说Python是一门伟大的入门语言?(附免费教程)

    Python 是一门伟大的入门语言.作为一门伟大的编程语言,一定要具备一些特征,其中有五项特征是非常重要的: 非常棒的首次体验:就像书的开始,首先一定要能够"沉迷",学习新知识一定 ...

  8. python映射类型有哪些_什么是python中唯一的映射类型

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

  9. python内存消耗大吗_如何减少python内存的消耗?

    标签: Python 打算删除大量涉及像C和C++语言那样的复杂内存管理.当对象离开范围,就会被自动垃圾收集器回收.然而,对于由Python 开发的大型且长期运行的系统来说,内存管理是不容小觑的事情. ...

  10. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

最新文章

  1. 确定神经网络层数以及神经元个数
  2. VBS编程基础教程 (第2篇)
  3. Stack Overflow 2020 开发者调查中的 21 条关键结果
  4. dbca no protocol support
  5. 标准评分卡分数计算原理_评分卡模型监控(前端分析)
  6. 回文数的个数、杨辉三角
  7. 机器学习-贝叶斯网络
  8. java ee 员工管理系统,fb3492 javaEE_原生Servlet_MySql企业员工信息管理系统的设计与实现,java源码含论文与答辩PPT...
  9. java实现系统参数的存储_基于ZooKeeper,Spring设计实现的参数系统
  10. 小程序_协作开发(版本控制)
  11. 数据包络(DEA)分析法python实现
  12. 北京的哪些地方开的发票可参与国家税务局的摇奖
  13. 关于尾注的一些问题-上
  14. 基于MATLAB图像处理的自动QQ小游戏(一)自动扫雷篇
  15. 圆锥螺旋线matlab 画,圆锥螺旋线 - calculus的日志 - 网易博客
  16. AlignedReID
  17. UMI+TS项目 配置多环境打包
  18. 80%学生的困惑,学完C/C++之后学什么?
  19. 设计师必须知道的 5个设计灵感网站
  20. 2021—10—31 上课笔记

热门文章

  1. 欢迎使用markdown编辑器20181206
  2. 在ASP.NET MVC里对Web Page网页进行权限控制
  3. 写一个能自动生成四则运算题目的软件,要求除了整数,还要支持正分数的四则运算。和同学们比较各自的程序功能、实现方法的异同。...
  4. 移动开发—HTML5 or Native?
  5. 很实用的 “设为首页”与“加入收藏”代码
  6. kangle web server源代码安装简明教程
  7. 公积金贷款不受影响 组合贷款有特殊
  8. ***正传——著名网络安全人士郭鑫成长经历
  9. 基于Python的MORSE音频的波形和频谱
  10. 不同版本gene ID比较