python什么是深拷贝什么是浅拷贝(Python深拷贝与浅拷贝用法实例分析)
python什么是深拷贝什么是浅拷贝
Python深拷贝与浅拷贝用法实例分析本文实例讲述了python深拷贝与浅拷贝用法。分享给大家供大家参考,具体如下:
1、对象的赋值
对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。
当对对象做赋值或者是参数传递或者作为返回值的时候,总是传递原始对象的引用,而不是一个副本。如下所示:
在python中将一个变量赋值给另一个变量,传递的是引用.无论是a的内层变化还是外层变化,b都会发生同样的变化.因为b和a指向了同一个引用.类似于c语言中的同一片内存地址.
|
#coding=utf-8 a = [ 1 , 2 , 3 ,[ 'a' , 'b' , 'c' ]] b = a print ( '*' * 50 ) print ( '--- b = a ---' ) print ( 'a = %s' % a) print ( 'b = %s' % b) a.append( 4 ) print ( '--- 外层a增加了元素4 ---' ) print ( 'a = %s' % a) print ( 'b = %s' % b) print ( '--- 内层增加了元素"d" ---' ) a[ 3 ].append( 'd' ) print ( 'a = %s' % a) print ( 'b = %s' % b) |
运行结果:
**************************************************
--- b = a ---
a = [1, 2, 3, ['a', 'b', 'c']]
b = [1, 2, 3, ['a', 'b', 'c']]
--- 外层a增加了元素4 ---
a = [1, 2, 3, ['a', 'b', 'c'], 4]
b = [1, 2, 3, ['a', 'b', 'c'], 4]
--- 内层增加了元素'd' ---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
b = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
2、对象的复制
当你想修改一个对象,而且让原始的对象不受影响的时候,那么就需要使用到对象的复制,对象的复制可以通过三种方法实现:
a、 使用切片操作进行拷贝 - -slice operation
(注:切片技术应用于所有的序列,包括:列表、字符串、元祖 ,但切片不能应用于字典。对字典只能使用d.copy()
方法或d.deepcopy()
方法.)
b、 使用工厂函数进行拷贝,list / dir / set - -factoryfunction
c、 copy.copy()
–use copymodule
在复制的时候,使用的是浅拷贝,复制了对象,但是对象中的元素,依然使用引用。
如下所示:
a = [1,2,3,['a','b','c']]
|
#coding=utf-8 import copy #1.切片操作 print ( '--- 切片操作 ---' ) b = a[:] print ( 'a = %s\tid(a) = %s' % (a, id (a))) print ( 'b = %s\tid(b) = %s' % (b, id (b))) #2.使用工厂函数 print ( '--- 使用工厂函数 ---' ) c = list (a) print ( 'a = %s\tid(a) = %s' % (a, id (a))) print ( 'c = %s\tid(c) = %s' % (c, id (c))) #3.copy.copy() print ( '--- copy.copy() ---' ) d = copy.copy(a) print ( 'a = %s\tid(a) = %s' % (a, id (a))) print ( 'd = %s\tid(d) = %s' % (d, id (d))) |
运行结果:
--- 切片操作 ---
a = [1, 2, 3, ['a', 'b', 'c']] id(a) = 140676047022088
b = [1, 2, 3, ['a', 'b', 'c']] id(b) = 140676047021320
--- 使用工厂函数 ---
a = [1, 2, 3, ['a', 'b', 'c']] id(a) = 140676047022088
c = [1, 2, 3, ['a', 'b', 'c']] id(c) = 140676047101640
--- copy.copy() ---
a = [1, 2, 3, ['a', 'b', 'c']] id(a) = 140436217635720
d = [1, 2, 3, ['a', 'b', 'c']] id(d) = 140436217656904
在使用浅拷贝的时候,发现引用的id都是相同的,但是字符串的id却发生了变化,是因为在python中,字符串是不可变的,从而在每次进行修改的时候,都是新建一个对象,从而引用发生了变化.
在不可变类型中,数字和字符串都是不可变类型,从而在每次修改的时候,都是新创建一个对象。
3、模块
核心模块:copy
浅拷贝和深拷贝的操作都可以在copy模块中找到,其实copy模块中只有两个函数可用,copy()进行浅拷贝操作,而deepcopy()进行深拷贝操作.
如下所示:
|
#coding=utf-8 import copy a = [ 1 , 2 , 3 ,[ 'a' , 'b' , 'c' ]] #浅拷贝拷贝的是外层即顶级对象,对于内层只拷贝引用 #所以在a的外层增加了元素,而c并没有变化.而在a的内层增加元素后,c发生了同样的变化.(回顾b=a) print ( '*' * 50 ) print ( '--- c = copy.copy(a)---' ) c = copy.copy(a) print ( 'a = %s' % a) print ( 'c = %s' % c) a.append( 4 ) print ( '---外层a增加了元素4---' ) print ( 'a = %s' % a) print ( 'c = %s' % c) print ( '---内层增加了元素"d"---' ) a[ 3 ].append( 'd' ) print ( 'a = %s' % a) print ( 'c = %s' % c) #深拷贝会递归的拷贝所有内容,将所有的内容都独自拷贝了一份. #故而,无论a的外层还是内层发生变化,都不会影响到d. print ( '*' * 50 ) print ( '--- d = copy.deepcopy(a) ---' ) d = copy.deepcopy(a) print ( 'a = %s' % a) print ( 'd = %s' % d) a.append( 5 ) print ( '---外层a增加了元素5---' ) print ( 'a = %s' % a) print ( 'd = %s' % d) print ( '---内层增加了元素"e"---' ) a[ 3 ].append( 'e' ) print ( 'a = %s' % a) print ( 'd = %s' % d) |
运行如下:
**************************************************
--- c = copy.copy(a)---
a = [1, 2, 3, ['a', 'b', 'c']]
c = [1, 2, 3, ['a', 'b', 'c']]
---外层a增加了元素4---
a = [1, 2, 3, ['a', 'b', 'c'], 4]
c = [1, 2, 3, ['a', 'b', 'c']]
---内层增加了元素"d"---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
c = [1, 2, 3, ['a', 'b', 'c', 'd']]
**************************************************
--- d = copy.deepcopy(a) ---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
d = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
---外层a增加了元素5---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
d = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
---内层增加了元素"e"---
a = [1, 2, 3, ['a', 'b', 'c', 'd', 'e'], 4, 5]
d = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
4、拷贝的警告
第一:非容器类型(比如数字,字符串和其他原子类型的对象,例如代码,类型和xrange对象等)没有拷贝一说,浅拷贝是完全用切片操作来完成的。
第二:如果元组变量只包含原子类型对象,那么深拷贝将不会进行。
|
#coding=utf-8 import copy a = ( 1 , 2 , 3 ) print ( '*' * 50 ) print ( '--- c = copy.copy(a)---' ) c = copy.copy(a) print (a, id (a)) print (c, id (c)) print ( '*' * 50 ) print ( '--- d = copy.deepcopy(a) ---' ) d = copy.deepcopy(a) print (a, id (a)) print (d, id (c)) |
运行如下:
**************************************************
--- c = copy.copy(a)---
(1, 2, 3) 140394676674992
(1, 2, 3) 140394676674992
**************************************************
--- d = copy.deepcopy(a) ---
(1, 2, 3) 140394676674992
(1, 2, 3) 140394676674992
可见:
对于可变类型来说,深拷贝和浅拷贝是不同的.
而对于不可变类型来说,深拷贝和浅拷贝的结果相同!
希望本文所述对大家python程序设计有所帮助。
原文链接:https://blog.csdn.net/xuezhangjun0121/article/details/76945033
- python元组操作方法(Python元组常见操作示例)
- python实例教程(Python魔法方法详解)
- pythonlist类型教程(Python List cmp知识点总结)
- python如何实现日期自动增加(Python脚本按照当前日期创建多级目录)
- python取当前日期(Python实现根据日期获取当天凌晨时间戳的方法示例)
- python字典的值排序(python 对字典按照value进行排序的方法)
- python矩阵怎么生成(python实现矩阵打印)
- python核心编程和python基础教程(从0开始的Python学习014面向对象编程推荐)
- ipython命令行查看文件夹(对IPython交互模式下的退出方法详解)
- java入坑rabbitmq(Python操作rabbitMQ的示例代码)
- python变量与对象的关系(Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析)
- python中怎么查看函数的用法(Python中函数的基本定义与调用及内置函数详解)
- pythontime模块有哪些(Python3.5内置模块之time与datetime模块用法实例分析)
- python中查看数据类型的内置函数(python学习——内置函数、数据结构、标准库的技巧推荐)
- python 循环遍历新方法(python for 循环获取index索引的方法)
- python批量转换图片格式(利用Python对文件夹下图片数据进行批量改名的代码实例)
- SCI检索 SSCI检索 EI检索 ISTP检索 CSCD检索简介(SCI检索SSCI检索EI检索)
- 参考文献里期刊名称的写法,你知道吗(参考文献里期刊名称的写法)
- 硕博期刊 SCI SSCI CSSCI分不清 一文带你看懂主流期刊分类(硕博期刊SCISSCI)
- 辱华品牌新百伦官宣新代言人IU,个别粉丝希望get爱豆同款(辱华品牌新百伦官宣新代言人IU)
- 巅峰时期被爆床照,曾被选国民最讨厌女星,IU不为人知的黑历史(巅峰时期被爆床照)
- 每天1万吨牛奶倒进下水道,美国大萧条一幕重现(每天1万吨牛奶倒进下水道)
热门推荐
- php教程字符串类型进阶技术教程(PHP中有关长整数的一些操作教程)
- mysql数据库与表的基本操作总结(Mysql、Oracle中常用的多表修改语句总结)
- web服务器软件的知识体系(七款主流WEB服务器软件点评)
- mysql提高分页效率(MySQL优化教程之超大分页查询)
- 支持多种数据库的数据库管理工具:navicat premium
- js 定时切换图片(JavaScript定时器实现无缝滚动图片)
- dedecms搜索功能怎么设置详细(DEDECMS 隔行换色以及分组加线修改方法)
- mysql中的默认mysql数据库作用(MySQL安装后默认自带数据库的作用详解)
- css设置背景图片在角落(详解使用CSS固定页面背景图片位置的方法)
- 虚拟主机和云服务区别(云主机与虚拟主机有什么不同?)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9