ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

4.Python的(内存机制)浅拷贝和深拷贝

2021-11-29 11:35:42  阅读:121  来源: 互联网

标签:映射 Python 空间 地址 内存 print 拷贝 id


Python内存机制:

a =b
print(id(a))
print(id(b))
#我们会发现运行之后打印的id一致
a = 1
b = 2
print(id(a))
print(id(b))
#我们会发现运行之后打印的id不一致
a = 1
b = 1
print(id(a))
print(id(b))
#我们会发现运行之后打印的id一致

Python的代码是在内存里运行的,Python吧内存的存储分为两个区,一个叫“映射区”,另一个叫“池”。

  首先Python先查看赋值的值是否在“池”里存在,如果不存在,则在“池”这个区域开个空间,将所要存的值存进去,并给予一个地址(id),并让赋值的变量名在“映射区”与“池”里的值映射,也就是将这两个连在一起。

例如:a = 1  1这个值在“池”开了空间并有了个地址(id),a就在“映射区”与1这个值的地址(id)对映(相连接)。

如果这时候再有个赋值,例如:b = 1,1在“池”里已经有了个位置了,为了节省空间,所以b直接在“映射区”与“池”里的1这个值的地址对映(相连接),这时候,打印a和b的id也就一致了。

如果是容器型数据类型,那该怎么存呢?

首先,在“池”开一个大空间(这个空间有地址),假设是a列表有3个值,这个空间分成三部分,这三个部分分别存储三个值的地址(id),例如下方代码,1在之前的例子已经开辟了一个空间并且有了地址,那么这个大空间的第一部分将之前数值1的地址引过来。如果第二个值没有在“池”中存储,那么就开辟一个新的并给予地址。再讲这个地址引向大空间的第二部分

a = [1,2,3]
b = a
b[1] = 11

而b在“映射区”所对应的是大空间的地址,a在“映射区”也是对映的大空间的地址,a与b的地址一致,如果b对a进行下标[1]更改,那么,他会看更改的值是否在“池”中,如果没有则开辟并给予地址,然后将数值11的地址引到第二部分,并取消对之前地址(也就是数值2)的引用。更改的是大空间里面所对应位置的地址。

这种将a赋值到b,在b中更改会影响到a的数值,是浅拷贝

深拷贝需要导包,import copy。深拷贝的使用方法是copy.deepcopy()。

深拷贝不会影响原有的的地址,例如:

import copy
a = [1,2,3,4]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
#运行后打印的id不一致

 

 

 

 

标签:映射,Python,空间,地址,内存,print,拷贝,id
来源: https://www.cnblogs.com/zx77/p/15596649.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有