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