Python学习笔记——可变对象和不可变对象
2016-12-12 00:00
387 查看
知识点:Python中,万物皆对象。
python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。
不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable):字典型(dictionary)、列表型(list)
不可变类型特点:
看下面的例子(例1)
从上图可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。
看一个例子(例2)
如上所示,因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址,值得注意的是,整形来说,目前仅支持(-1,100)。
总结一下,不可变对象的优缺点。
优点是,这样可以减少重复的值对内存空间的占用。
缺点呢,如例1所示,我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。
下面看一个可变对象的例子(例3)
1、可变对象,参数改变的是可变对象,其内容可以被修改。
2、不可变对象,改变的是函数内变量的指向对象。
备注:
可变,就是在内存中的那 块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域 就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内 存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。
可变对象:int、字符串(string)、float、(数值型number)、元组(tuple)改变的是地址增长或者减短。
不可变对象:字典型(dictionary)、列表型(list)改变的是地址指针。
python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。
一、可变对象和不可变对象
Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable):字典型(dictionary)、列表型(list)
不可变类型特点:
看下面的例子(例1)
从上图可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。
看一个例子(例2)
>>>x = 1 >>>y = 1 >>>z = 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、不可变对象,改变的是函数内变量的指向对象。
备注:
可变,就是在内存中的那 块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域 就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内 存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。
可变对象:int、字符串(string)、float、(数值型number)、元组(tuple)改变的是地址增长或者减短。
不可变对象:字典型(dictionary)、列表型(list)改变的是地址指针。
相关文章推荐
- Python学习笔记——可变类型&不可变类型&深拷贝&浅拷贝
- python学习之路——函数关于可变对象和不可变对象问题
- Python学习笔记——可变对象和不可变对象
- webdriver(python)学习笔记六——操作测试对象
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python学习笔记十 类文件对象
- python 学习笔记 对象(4)
- 【Python学习笔记】list/dict对象复制的误区与正确方法
- python学习笔记6-基本对象和流程语句整理
- python学习笔记——6_面向对象
- python cookbook 学习笔记 -- 1.3 测试一个对象是否是类字符串
- Python核心编程--学习笔记--4--Python对象
- Python学习笔记 03 Python对象
- python 学习笔记 -- 类与对象
- Python学习笔记 03 Python对象
- python变量赋值(可变与不可变) 分类: python基础学习 python Module 2013-10-30 11:59 1036人阅读 评论(0) 收藏
- Python对象学习笔记
- Python学习笔记——文件对象和操作(1)
- Dive in Python学习笔记五:对象和面向对象
- python基础学习笔记5--对象