一、深浅拷贝的区别

    深浅拷贝一般是在列表嵌套列表的情况下去讨论

    浅拷贝:只拷贝列表中对象的引用,嵌套列表中的数据是不会进行全部拷贝的

    深拷贝:会把对象里面所有的数据都拷贝一份,不再只拷贝对象的引用,会另开内存存储

# 浅拷贝: 只拷贝列表中对象的引用,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内存地址不一样

 

版权声明:本文为solememory原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/solememory/p/13280049.html