python学习笔记:深浅拷贝的使用和原理
2017-09-20 12:54
627 查看
在理解深浅拷贝之前,我们先熟悉下变量对象和数据类型
1.变量和对象
变量-引用-对象(可变对象,不可变对象)
在python中一切都是对象,比如[1,2],'hello world',123,{'k1':'v1'},
比如说:
>>> a = 3
专业表述如下:
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
特别注意: 类型属于对象,不是变量
共享引用: 比如说:
>>> a = 3
>>> b = a
在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.
2.数据类型
在python中数据类型包括:int,bool,float,str,dict,tuble,set,list等等,
首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。
用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
3.对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址。
4.对于字典,列表等可变对象:
例1,关于赋值,只是创建一个变量,该变量仍指向原来内存地址;
例2,浅拷贝,
例3:深拷贝,在内存中将所有的数据重新创建一份,值的存放位置不变。
5.应用:
参考:
http://www.cnblogs.com/repo/p/5425774.html http://blog.csdn.net/jerry_1126/article/details/41852591
1.变量和对象
变量-引用-对象(可变对象,不可变对象)
在python中一切都是对象,比如[1,2],'hello world',123,{'k1':'v1'},
比如说:
>>> a = 3
专业表述如下:
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
特别注意: 类型属于对象,不是变量
共享引用: 比如说:
>>> a = 3
>>> b = a
在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.
2.数据类型
在python中数据类型包括:int,bool,float,str,dict,tuble,set,list等等,
首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。
用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
3.对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址。
import copy a = "i love python" b = a a1 = copy.copy(a) a2 = copy.deepcopy(b) print(id(a)) print(id(b)) print(id(a1)) print(id(a2)) #输出: 2114011486192 2114011486192 2114011486192 2114011486192
4.对于字典,列表等可变对象:
例1,关于赋值,只是创建一个变量,该变量仍指向原来内存地址;
#赋值 D = {'k1':'v1','k2':123,'k3':["str1",469]} D2 = D print(id(D)) print(id(D2)) #输出: 2178677065032 2178677065032
例2,浅拷贝,
#浅拷贝 D = {'k1':'v1','k2':123,'k3':["str1",469]} D2 = copy.copy(D) #浅拷贝,额外创建第一层(变量名id改变,对象id不变,还是引用旧对象) print(id(D)) print(id(D2)) print(id(D["k1"])) print(id(D2["k1"])) #输出; 1993456403784 1993456836488 1993456800856 1993456800856
例3:深拷贝,在内存中将所有的数据重新创建一份,值的存放位置不变。
D = {'k1':'v1','k2':123,'k3':["str1",469]} D2 = copy.deepcopy(D) print(id(D)) print(id(D2)) print(id(D["k3"])) print(id(D2["k3"])) print(id(D["k3"][0])) print(id(D2["k3"][0])) #输出: 2129861461320 2129861875016 2129863354440 2129863327624 2129861860856 2129861860856
5.应用:
#浅拷贝,改变新字典,久字典也一起改变 dict = {"cpu":[100],"mem":[200],"disk":[300]} new_dict = copy.copy(dict) new_dict["cpu"][0] = 90 print(new_dict) print(dict) #输出: {'cpu': [90], 'mem': [200], 'disk': [300]} {'cpu': [90], 'mem': [200], 'disk': [300]}
#深拷贝,改变新字典,久字典没变 dict = {"cpu":[100],"mem":[200],"disk":[300]} new_dict = copy.deepcopy(dict) new_dict["cpu"][0] = 90 print(new_dict) print(dict) #输出: {'cpu': [90], 'mem': [200], 'disk': [300]} {'cpu': [100], 'mem': [200], 'disk': [300]}
参考:
http://www.cnblogs.com/repo/p/5425774.html http://blog.csdn.net/jerry_1126/article/details/41852591
相关文章推荐
- Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝
- python学习笔记:*args和**kwargs使用原理?
- python学习笔记:datetime使用小结
- Python学习笔记--为什么需要使用__name__=='__main__'
- python学习笔记3:使用字符串
- Python学习笔记之疑问10:如何使用分隔符连接list中的字符串
- linux 学习笔记 (3) —— 使用python
- [学习笔记]使用py2exe打包python程序
- python Django 学习笔记(四)—— 使用MySQL数据库
- python学习笔记--循环使用
- python学习笔记之--os.walk使用
- python学习笔记(五)深拷贝浅拷贝,文件和目录
- Python学习笔记十二:列表(4)--len 、in、For的使用
- Python 学习笔记(三) 使用字符串
- python学习笔记之二:使用字符串
- Python学习笔记IDLE使用
- SVM学习笔记(2)LIBSVM在python下的使用
- python Django 学习笔记(三)—— 模版的使用
- Python 学习笔记【使用元组的注意点】
- 【hadoop】Hadoop学习笔记(七):使用distcp并行拷贝大数据文件