python中的copy与deepcopy

引子:首先我们有一个赋值运算作为引子,如下

1 l1 = [1, 2, 3, [‘java‘, ‘python‘]]
2 l2 = l1
3 l1[0] = 111
4 print(l1)    #输出结果:[111, 2, 3, [‘java‘, ‘python‘]]
5 print(l2)    #输出结果:[111, 2, 3, [‘java‘, ‘python‘]]
6 #由上面的例子我们不难明白,python中对于赋值运算来说,l1与l2指向的是同一个地址,所以他们是完全一样的。

1.浅拷贝copy()

 1 l1 = [1, 2, 3, [‘java‘, ‘python‘]]
 2 l2 = l1.copy()
 3 print(l1,id(l1))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 46594648
 4 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 46861728
 5
 6 l1[2] = 222
 7 print(l1,id(l1))      #输出结果:[1, 2, 222, [‘java‘, ‘python‘]] 46594648
 8 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 46861728
 9
10 l1[1] = 333
11 print(l1,id(l1))      #输出结果:[1, 333, 222, [‘java‘, ‘python‘]] 86112856
12 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 86707576
13
14 l1[3][0] = ‘c++‘
15 print(l1,id(l1))      #输出结果:[1, 333, 222, [‘c++‘, ‘python‘]] 88013360
16 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘c++‘, ‘python‘]] 88608080
17 #对于浅拷贝来说,第一层创建的是新的地址,然而第二层就不一样的,输入的改变也会影响到拷贝项的改变

2.深拷贝deepcopy

 1 import copy
 2 l1 = [1, 2, 3, [‘java‘, ‘python‘]]
 3 l2 = copy.deepcopy(l1)
 4
 5 print(l1,id(l1))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 57042104
 6 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 57043024
 7
 8 l1[2] = 222
 9 print(l1,id(l1))      #输出结果:[1, 2, 222, [‘java‘, ‘python‘]] 57042104
10 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 57043024
11
12 l1[1] = 333
13 print(l1,id(l1))      #输出结果:[1, 333, 222, [‘java‘, ‘python‘]] 57042104
14 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 57043024
15
16 l1[3][0] = ‘c++‘
17 print(l1,id(l1))      #输出结果:[1, 333, 222, [‘c++‘, ‘python‘]] 57042104
18 print(l2,id(l2))      #输出结果:[1, 2, 3, [‘java‘, ‘python‘]] 57043024
19 #对于深拷贝deepcopy来说,无论创建多少个,这些每个之间都是独立的,改变任意一个元素,20 #都不会影响到其他的,无论多少层都是一样的

原文地址:https://www.cnblogs.com/rcat/p/9296769.html

时间: 2024-10-08 21:12:06

python中的copy与deepcopy的相关文章

转载:python中的copy模块(浅复制和深复制)

主要是介绍python中的copy模块. copy模块包括创建复合对象(包括列表.元组.字典和用户定义对象的实例)的深浅复制的函数. ########copy(x)########创建新的复合对象并通过引用复制x的成员来创建x的浅复制.更加深层次说,它复制了对象,但对于对象中的元素,依然使用引用.对于内置类型,此函数并不经常使用.而是使用诸如list(x), dict(x), set(x)等调用方式来创建x的浅复制,要知道像这样直接使用类型名显然比使用copy()快很多.但是它们达到的效果是一样

Python字典方法copy()和deepcopy()的区别

1 from copy import deepcopy # import deepcopy模块 2 d = {} 3 d['name'] = ['black', 'guts'] # d = {'name': ['black', 'guts']} 4 c = d.copy() # c = {'name': ['black', 'guts']} 5 dc = deepcopy(d) # dc = {'name': ['black', 'guts']} 6 d['name'].append('whit

python中的copy.copy和copy.deepcopy

一个例子就搞清楚 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改对象a中的['a', 'b']数组对象 print 'a = ', a print 'b = ', b print 'c = ', c print 'd = '

从python中copy与deepcopy的区别看python引用

讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比一下PHP中的赋值和引用就有大致的概念了.参考下面一段引用: 1. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当

Python 中copy和deepcopy的区别

import copy 假设在python中对list的复制 copy称为浅复制 deepcopy称为深复制 浅复制和深复制在一般的list中作用是相同的,都是进行一个复制 但是在list嵌套list中就会有区别 比如: a = [1,2,[3,4]] b = copy.copy(a) c= copy.deep.copy(a) b就等于[1,2,[3,4]] c就等于[1,2,[3,4]] 但是如果改变b[2][0] = 1 c[2][0] = 2] 改变后b = [1,2,[1,4]] c =

Python copy对象(copy与deepcopy)

Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 看下面的一个实例 import copy init = [1, 2, 3, 4, ['a', 'b']] #原始对象 assign = init #赋值,传对象的引用 cp = copy.copy(init) #对象拷贝,浅拷贝 dcp = copy.deepc

python中的shallow copy 与 deep copy

今天在写代码的时候遇到一个奇葩的问题,问题描述如下: 代码中声明了一个list,将list作为参数传入了function1()中,在function1()中对list进行了del()即删除了一个元素. 而function2()也把list作为参数传入使用,在调用完function1()之后再调用function2()就出现了问题,list中的值已经被改变了,就出现了bug. 直接上代码: list = [0, 1, 2, 3, 4, 5] def function1(list): del lis

python3下关于copy和deepcopy中的区别

很多人在学习python3的时候,在字典部分copy和deepcopy感到很困惑,现在针对这两个方法进行区分,即一种是浅复制(copy),一种是深度复制(deepcopy). 开头先下个结论 我们日常所说的复制(自己在电脑硬盘上的复制)就是深复制(deepcopy),即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响. 而浅复制(copy)并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签指向的数据

Python中列表list常见操作

主要涉及知识点 列表是我们python里面最常见的数据类型,我们主要有以下的操作. 1.索引 2.切片 3.追加 4.删除 5.长度 6.循环 (也称遍历) 7.包含 8.嵌套 例如定义列表: List2=['openstack','python','linux',"docker","zabbix","nginx","linux","linux","123","ww33##&q