python的内存机制是什么意思_python 内存机制

list的复制

当我们想要根据已有的一个列表创建一个新的列表的时候,会涉及到列表的拷贝问题

直接使用“=”复制

a = [1,2,3]

b = a

print a, id(a) #[1, 2, 3] 54073032

print b, id(b) #[1, 2, 3] 54073032

创建了一个新的变量b,可见a和b都指向一个内存地址,b可以理解为a的一个别名,对a的修改会影响到b

内建函数id()返回对象的内存地址

浅拷贝

切片

c = a[:]

print c, id(c) #[1, 2, 3] 59576584

切片运算符返回一个序列的切片,切片过程中是切下列表的一部分,创建新的表,将切下的部分复制到新的表,因此c与a的id不一样

copy()

d=copy.copy(a)

print d, id(d) #[1, 2, 3] 49157128

list()

通过列表构造函数

e = list(a)

print e, id(e) #[1, 2, 3] 60562760

可通过以上三种方法实现列表的浅拷贝,浅拷贝只能copy一层

a = [1,[0,1],3]

d=copy.copy(a)

a.append(4)

a[1].append(2)

print a, id(a) # [1, [0, 1, 2], 3, 4] 48239112

print d, id(d) # [1, [0, 1, 2], 3] 48301064

如果列表中包含列表,浅拷贝生产的新列表的子列表都是指向同一个对象上,对这个对象的修改会互相影响。

深拷贝

a = [1,[0,1],3]

c=copy.deepcopy(a)

a.append(4)

a[1].append(2)

print a, id(a) #[1, [0, 1, 2], 3, 4] 52708040

print c, id(c) #[1, [0, 1], 3] 51004104

只有深拷贝得到的新列表才是包括子列表在内的完全复制

字典的复制

浅复制只是把当前字典内的子对象的引用复制给新字典,当被复制字典的子对象内容改变时,新字典的子对象内容也会改变;深复制把当前字典的全部内容,也包括子对象的内容都完全复制给新字典,被复制字典和新字典是两个独立的数据对象,被复制字典内容的改变不会影响新字典的内容。浅复制用copy方法,深复制用deepcopy方法

浅拷贝,复制时只会复制父对象,而不会复制对象的内部的子对象

深拷贝,复制对象及其子对象

内存

关系图如下:

image.png

变量:通过变量指针引用对象,变量指针指向具体对象的内存空间,取对象的值

对象:类型已知,每个对象都包含一个头部信息(类型标识符和引用计数器)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值