PYTHON学习0012:深浅COPY----2019-6-8
作者:互联网
1、当变量为字符串或者数字时,a=1,b=a时,b指向的并不是a的值,而是指向a的内存地址1,b=1。所以当吧a重新赋值后,比如a=666,b还是=1。其中,a和b只是内存地址1的标签。
2、但当如果变量为列表时,因为在列表中,列表本身有一个内存地址,列表里的元素也有自身独立的内存地址,比如m=【1,2,4】,n=m,此时n指向的是m列表的内存地址(也就是说2个列表的内存地址是一样的),而不是其内元素的内存地址,所以当列表m内的元素改变,比如m【0】=6时,m=【6,2,4】,此时n也跟着变为n=【6,2,4】。列表里面元素的改变导致其内存地址的改变不会改变列表的内存地址。
3、如果要实现2个列表完全独立,也就是后赋值的列表里的元素不随着原始列表元素的变动而变动,就要使用copy函数,比如m=n.copy()
例子:s=【1,2,“a”】,f=s.copy()。此时f虽然=【1,2,“a”】,但是f和s的内存地址是不一样的,f和s可以看做是内存地址的一个标签,【1,2,“a”】可以看做是一个值。等于就是2个不同的内存地址共享了同一个值,分别是不同的标签而已。所以当s列表里的元素改变,s【2】=666时,s=【1,2,666】。f由于其内存地址没变还是=【1,2,“a”】。
但如果是嵌套列表时,比如s=【1,2,【“pw”,18】】,f=s.copy()。此时f也是=【1,2,【“pw”,18】】,f和s的内存地址不一样,但共享了元素的值,其中之列表【“pw”,18】是作为单个元素的。如果此时改动s里的子列表里的值,比如s【2】【1】=23,此时s=【1,2,【“pw”,23】】,f也=【1,2,【“pw”,23】】。是因为子列表里元素的地址和子列表地址是不一样且独立的。copy函数只是共享了原始列表里的元素的内存地址,而且只能COPY到列表里元素的第一层,且子列表的元素地址的改动会改变元素的地址,但并不影响子列表的地址,所以但在嵌套列表里,使用copy函数时,原始列表的子列表里的元素改动,被赋值的列表的子列表的元素也一起改动。这种copy就叫浅copy。
如果连子列表也要完全独立,则要深copy:
需要导入模块:
import copy
f=copy.deepcopy(s)#就能实现完全COPY
这个应用较少,知道这个概念即可。
标签:内存地址,0012,PYTHON,元素,列表,地址,2019,copy,pw 来源: https://blog.51cto.com/13543767/2406391