类的浅拷贝与深拷贝
变量的赋值操作
·只是形成两个变量,实际上还是指向同一个对象
浅拷贝
·Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝因此,源对象与拷贝对象会引用同一个子对象
深拷贝
·使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对像和拷贝对象所有的子对象也不相同
class CPU: pass class Disk: pass class Computer: def __init__(self,cpu,disk):
self.cpu=cpu self.disk #(1)变量的赋值 cpu1=CPU() cpu2=cpu1 print(cpu1,id(cpu1))
print(cpu2,id(cpu2)) #(2)类的浅拷贝 disk=Disk() computer=Computer(cpu1,disk) #浅拷贝
import copy print(disk) computer2=copy.copy(computer.disk)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk) #深拷贝
computer3=copy.deepcopy(computer) print(computer,computer.cpu,computer.disk)
print(computer3,computer2.cpu,computer2.disk)
不可变类型:该数据类型对象所指定内存中的值不可以被改变。
(1)、在改变某个对象的值时,由于其内存中的值不可以被改变,所以,会把原来的值复制一份再进行改变,这样就会计算机会开辟一段新的内存空间来存储新的值。
可变类型:该数据类型的对象所指定的地址上面的值可以被改变。
(1)、变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发生开辟新的内存地址行为,不会重新开辟空间。
* 变量:是一个系统表的元素,拥有指向对象的连接空间
* 对象:被分配的一块内存,存储其所代表的值
* 引用:是自动形成的从变量到对象的指针
变量是内存引用
在 Python 程序中,每个对象都会在内存中申请开辟一块空间来保存该对象,该对象在内存中所在位置的地址被称为引用,使用变量名进行指代。
引用计数
引用计数算法很简单,它实际上是通过在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加一,如果删除对该对象的引用,那么它的引用计数就减一,当该对象的引用计数为0时,那么该对象就会被回收。