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
这个应用较少,知道这个概念即可。
- python学习笔记三之深浅copy,扩展数据类型(基础篇)
- python学习day7 深浅拷贝&文件操作
- python基础----list的深浅copy
- python开发学习-day03(set集合、collection系列 、深浅拷贝、函数)
- [Python模块学习]copy模块,设计模式中的原型模式
- python之集合,深浅copy
- python基础3(元祖、字典、深浅copy、集合、文件处理)
- python 浅析格式化输出和深浅copy
- python深浅copy-转自EVA的博客
- Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝
- python的深浅拷贝 copy
- python学习笔记——列表copy
- iOS学习笔记 strong与copy 深浅复制
- python——深浅copy 及一些补充知识点
- python 深浅copy的例子
- Python学习之深浅拷贝
- Python 学习日记第六篇 -- 深浅拷贝
- python 学习笔记 copy
- 3.2 Python列表 赋值 ‘=’,copy() ,slice[] 学习笔记006
- Python中的深浅拷贝:‘=’,copy(),deepcopy()