python中的可变对象和不可变对象

简介:

知识点:python中,万物皆对象。

知识点:python中,万物皆对象。  

 python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。

一、可变对象和不可变对象

Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。

不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)

可变(mutable):字典型(dictionary)、列表型(list)

不可变类型特点:

  看下面的例子(例1)


[python] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. i = 73  

  2. i += 2  


从上图可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。

  看一个例子(例2)

>>>x = 1
>>>y = 1
>>>x = 1
>>> x is y
True>>>y is z
True

  如上所示,因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址,值得注意的是,整形来说,目前仅支持(-1,100)。

  总结一下,不可变对象的优缺点。

    优点是,这样可以减少重复的值对内存空间的占用

    缺点呢,如例1所示,我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。

  下面看一个可变对象的例子(例3)

m=[5,9]
m+=[6]

二、函数参数:

Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;对于不可变对象,函数内对参数的改变不会影响到原始参数。原因在于:

1、可变对象,参数改变的是可变对象,其内容可以被修改。

2、不可变对象,改变的是函数内变量的指向对象。



本文转自 shouhou2581314 51CTO博客,原文链接:http://blog.51cto.com/thedream/1720828,如需转载请自行联系原作者

相关文章
|
21天前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
28 2
|
1月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
47 3
|
3月前
|
存储 缓存 Java
深度解密 Python 虚拟机的执行环境:栈帧对象
深度解密 Python 虚拟机的执行环境:栈帧对象
79 13
|
3月前
|
索引 Python
Python 对象的行为是怎么区分的?
Python 对象的行为是怎么区分的?
33 3
|
3月前
|
存储 缓存 算法
详解 PyTypeObject,Python 类型对象的载体
详解 PyTypeObject,Python 类型对象的载体
53 3
|
3月前
|
Python
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
29 1
|
3月前
|
缓存 Java 程序员
一个 Python 对象会在何时被销毁?
一个 Python 对象会在何时被销毁?
60 2
|
3月前
|
API Python 容器
再探泛型 API,感受 Python 对象的设计哲学
再探泛型 API,感受 Python 对象的设计哲学
27 2
|
3月前
|
API Python
当调用一个 Python 对象时,背后都经历了哪些过程?
当调用一个 Python 对象时,背后都经历了哪些过程?
32 2
|
3月前
|
存储 API C语言
当创建一个 Python 对象时,背后都经历了哪些过程?
当创建一个 Python 对象时,背后都经历了哪些过程?
30 2