在 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 指向同一个对象,然后我们试着修改一下 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】可变对象和不可变对象相关推荐

  1. python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期 | 学步园...

    最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...

  2. python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期

    最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...

  3. python内存回收垃圾有哪些_[Python之路] 内存管理垃圾回收

    一.python源码 1.准备源码 解压得到文件夹: 我们主要关注Include中的".h"文件以及Objects目录中的".c"文件. 我们从Include和 ...

  4. python中for循环的用法_@Python小白,一文让你掌握Python爬虫

    兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...

  5. 反序列化对象列表发生异常_面试官:你知道Java对象的序列化与反序列化背后的原理吗?...

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

  6. python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python

    请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...

  7. python c++情侣网名含义_#python和C/C++#让python和C/C++联姻

    让python不在孤单,轻易而举的为python写C/C++第三方库. 我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/ ...

  8. python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)

    爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...

  9. python三维图如何标注曲面_(python)使用colormap作为第4维,x,y,z函数绘制3d曲面 - python...

    我正在尝试绘制3d曲面,其中三个维度中的每个维度都在单独的值数组中,并且每个坐标处的曲面着色是x,y,z的函数.一种numpy.pcolormesh,但是是4D而不是3D的. 3D图由下式给出: fr ...

  10. python数值类型不包含复数_[python学习手册-笔记]003.数值类型

    003.数值类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...

最新文章

  1. [转]HTTP协议详解
  2. 四个月没返校,挂在宿舍的内裤变“鸟窝”,网友:画面太美,不敢面对
  3. vCenter连接esxi 5.0报“Datacenter.QueryConnectionInfo” 失败
  4. linux目录为root所有文件,linux获取文件所有目录/文件夹的例子linux操作系统 -电脑资料...
  5. Python Set Literals
  6. ML之catboost:基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)
  7. 使用两个队列实现一个栈
  8. pythoncad二次开发视频_AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--...
  9. 经典面试题(49):以下代码将输出的结果是什么?
  10. 用汇编的眼光看C++(开篇)
  11. SQL Server Management Studio 2016的新功能–滚动条
  12. github创建maven项目过程
  13. DEDECMS v5.7 实现导航条下拉二级菜单
  14. 金九银十,果然如此,这个九月有点折腾
  15. 如何改善物流行业项目管理?
  16. 广讯通系统地址和服务器,广讯通OA办公系统
  17. 信息技术服务风险评估
  18. Cg学习记录003 之Varying参数
  19. [CM311-1A]- Android 文件/目录 管理
  20. python怎样使用各个日期赤纬_天文数据处理笔记之python(3)

热门文章

  1. 解决: Spring Boot报错 This application has no explicit mapping ... a fallback
  2. 解决: Client does not support authentication protocol requested by server; consider upgrading MySQL
  3. 使用 Docker 部署 Node 服务
  4. zookeeper安装和使用 windows环境
  5. Spring中的计时器StopWatch
  6. (2) MongoDB基本概念及与关系型数据库的对照
  7. 1003 我要通过
  8. Windows下多个JDK版本的切换方法
  9. 【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
  10. 第一次使用 Blog