Python初学____探究_____可变对象 不可变对象理解

Posted stankangyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python初学____探究_____可变对象 不可变对象理解相关的知识,希望对你有一定的参考价值。

1.  可变对象 & 不可变对象

①对于Python来说,变量=对象 的含义表示着 将该变量作为一个引用绑定到该对象上,当绑定完成后 即可通过变量名使用该对象。 一个对象不存在任何对象引用的时候,就进入了垃圾收集的过程(自动回收机制)。

②对于多元素的数据结构,如list,tuple,dict,其实现是通过指针数组来绑定到目标对象。

1.1可变对象

    在Python中的可变对象往往是多元素的数据结构,其大部分都是通过指针数组去绑定到元素对象的多元素可变对象中的可变,是指这个指针数组是可变的(指针数组可扩展缩小,数组元素可修改)

例1:

lt1 = ["sy","wsx","syf",100]

print(id(lt1))

lt1[0] = "wsx"

lt1.append(99)

print(id(lt1))

print(id(lt1[1]))

print(lt1)

技术分享图片

    在例1中,我们修改lt1[0]="wsx",就是要修改指针数组中 0号指针,使其绑定到值为"wsx"的对象上,由于其之前绑定的"sy"为字符串属于非可变对象,所以其必须舍弃再创建一个"wsx",由于之前内存中已经有了一个"wsx",所以我们让他绑定到这个。所以可以看到id(lt)和id(lt[1])多的结果相同。同理,我们让lt1增加一个元素,由于其是可变对象,直接在数组尾部插入一个元素指向100这个对象即可。

技术分享图片

    在上述过程中,这些多元素的可变对象的数组指针发生了改变

 

1.2不可变对象

    现在学到的Python不可变对象中,基本可以分为两类:一类是 通过指针数组实现的(如tuple),另一类则是没有通过指针数组实现的

    (1)对于tuple这些通过指针数组实现的不可变对象,不可变主要在于其指针数组不可改变

例1:

tup1 = ("syf","wsx","sy",[100])

tup1[3][0]=99

tup1[3].append(0)

print(tup1)

 技术分享图片

   可以看到tup1为不可变对象,但是最终其tup[3]的元素仍然被修改了,但在这个过程中我们没有修改 tup1指针数组中的指针元素,tup[3]仍指向原来的list。

 技术分享图片

 

 

   (2) 另一类则是像类似str,int这样的不可变,其不可变主要体现在 内容不可变。对于采用非数组指针形式的不可变对象,若我们修改时其会直接传创建一个新的目标对象。

i = 73  

i += 2

 技术分享图片

 

以上是关于Python初学____探究_____可变对象 不可变对象理解的主要内容,如果未能解决你的问题,请参考以下文章

python初学之魔法方法1

python_26_如何派生内置不可变类型并修改实例化行为

Python 中关于 __main__ 的概念探究

python全栈_004_Python3基本数据类型

Python3基础 __len__,__getitem__ 记录列表中元素访问的次数 定制不可变序列,下标字典

Python3基础 __len__,__getitem__ 记录列表中元素访问的次数 定制不可变序列,下标字典