python-----内存管理机制
一、深浅拷贝的区别
深浅拷贝一般是在列表嵌套列表的情况下去讨论
浅拷贝:只拷贝列表中对象的引用,嵌套列表中的数据是不会进行全部拷贝的
深拷贝:会把对象里面所有的数据都拷贝一份,不再只拷贝对象的引用,会另开内存存储
# 浅拷贝: 只拷贝列表中对象的引用,a的值发生变化后会影响到f a = [11,22,33] b = [1,2,3,a] # b里面调用a f = b.copy() # copy方法是浅拷贝 a.append("新值a") print("f的值", f) # 结果: [1, 2, 3, [11, 22, 33, '新值a']] # 从结果可以看到,修改了a的之后,d的值也会发生变化 # 深拷贝会把对象里面所有的数据都拷贝一份,另开一个内存存储,所以修改原来的对象拷贝出来的不受影响 import copy a = [11,22,33] b = [1,2,3,a] # 需要调用copy中的deepcopy函数 f = copy.deepcopy(b) a.append("新值a") print("f的值", f) # 结果:[1, 2, 3, [11, 22, 33]] # 从结果可以看到,修改了a的值并没有影响到f的值
二、小整数池
python中的整数池也是为了节约内存而设计的, 避免为整数频繁申请和销毁内存空间
小整数池范围:-5到256
>>> a = -5 >>> b = -5 >>> id(a) 140732735804256 >>> id(b) 140732735804256 >>> a = -6 >>> b = -6 >>> id(a) 3147946898928 >>> id(b) 3147918100496 >>> a = 256 >>> b = 256 >>> id(a) 140732735812608 >>> id(b) 140732735812608 >>> a = 257 >>> b = 257 >>> id(a) 3147918100496 >>> id(b) 3147918100368
上述代码可以看到,-5到256之间的数字,打印的内存地址都是一样的,注意不要直接在pycharm运行,因为pycharm会做优化,导致打印的内存地址是一样的,需要在python命令行中运行
三、大整数池
开始是空的,如果第一次定义一个字符串只有数字,字母,下划线三个元素组成,python会把这个值存储到大整数池,下次调用就会去这个大整数池调用
a = 'a_bc11' c = 'a_bc11' d = 'a_ !bc11' print(id(a)) # 结果:2156715830048 print(id(c)) # 结果:2156715830048 print(id(d)) # 结果:2156713793048
从结果可以看到a,c两个内存地址是一样的,因为都是调用大整数池,d里面因为存在其他特殊字符,导致a,c内存地址不一样