1.变量,对象,引用
变量是一个系统表的元素,拥有指向对象的连接的空间;
对象是分配的一块内存;
引用是自动形成的从变量到对象的指针;
类型属于对象,而不是变量
a=3; 变量a变成对象3的一个引用,内存中以指针形式实现
2. 对象的垃圾收集
垃圾收集:每个对象中保持一个计数器,计数器记录了当前指向该对象的引用的数目;一旦计数器设置为0,则对象的内存空间就会自动收回。
好处——可以在脚本中任意使用对象而不需要考虑释放内存空间
3.共享引用
变量是一个指向对象的指针,而不是可以改变的内存区域的标签:给一个变量赋一个新的值,并不是替换了原始的对象,而是让这个变量去引用一个完全不同的一个对象。实际的效果就是对一个变量赋值,仅仅会影响那个被赋值的变量。
可变对象,以及原处的改变,有些不同。
4.共享引用和在原处修改
上图,L1的原处修改影响到L2,如何避——需要Python拷贝对象:内置列表函数,标准库copy模块,切片
5. 共享引用和相等
”==“操作符——测试两个被引用的对象是否有相同的值
”is操作符“——检查两个变量是否指向同一个对象
6. 引用 VS 拷贝:
(1)没有限制条件的分片表达式(L[:])能够复制序列,但此法只能浅层复制。
(2)字典 copy 方法,D.copy() 能够复制字典,但此法只能浅层复制
(3)有些内置函数,例如 list,能够生成拷贝 list(L)
(4)copy 标准库模块能够生成完整拷贝:deepcopy 本质上是递归 copy
(5)对于不可变对象和可变对象来说,浅复制都是复制的引用,只是因为复制不变对象和复制不变对象的引用是等效的(因为对象不可变,当改变时会新建对象重新赋值)。所以看起来浅复制只复制不可变对象(整数,实数,字符串等),对于可变对象,浅复制其实是创建了一个对于该对象的引用,也就是说只是给同一个对象贴上了另一个标签而已。