Python教程

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

本文主要是介绍4.Python的(内存机制)浅拷贝和深拷贝,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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不一致

 

 

 

 

这篇关于4.Python的(内存机制)浅拷贝和深拷贝的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!