python中的深浅Copy

二,深浅copy

1,先看赋值运算。

l1 = [1,2,3,[‘barry‘,‘alex‘]]
l2 = l1

l1[0] = 111
print(l1)  # [111, 2, 3, [‘barry‘, ‘alex‘]]
print(l2)  # [111, 2, 3, [‘barry‘, ‘alex‘]]

l1[3][0] = ‘wusir‘
print(l1)  # [111, 2, 3, [‘wusir‘, ‘alex‘]]
print(l2)  # [111, 2, 3, [‘wusir‘, ‘alex‘]]

对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。

2,浅拷贝copy。

l1 = [1,2,3,[‘barry‘,‘alex‘]]
l2 = l1.copy()
print(l1,id(l1))  # [1, 2, 3, [‘barry‘, ‘alex‘]] 2380296895816
print(l2,id(l2))  # [1, 2, 3, [‘barry‘, ‘alex‘]] 2380296895048
l1[1] = 222print(l1,id(l1))  # [1, 222, 3, [‘barry‘, ‘alex‘]] 2593038941128print(l2,id(l2))  # [1, 2, 3, [‘barry‘, ‘alex‘]] 2593038941896
l1[3][0] = ‘wusir‘
print(l1,id(l1[3]))  # [1, 2, 3, [‘wusir‘, ‘alex‘]] 1732315659016
print(l2,id(l2[3]))  # [1, 2, 3, [‘wusir‘, ‘alex‘]] 1732315659016

对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

3,深拷贝deepcopy。

import copy
l1 = [1,2,3,[‘barry‘,‘alex‘]]
l2 = copy.deepcopy(l1)

print(l1,id(l1))  # [1, 2, 3, [‘barry‘, ‘alex‘]] 2915377167816
print(l2,id(l2))  # [1, 2, 3, [‘barry‘, ‘alex‘]] 2915377167048

l1[1] = 222
print(l1,id(l1))  # [1, 222, 3, [‘barry‘, ‘alex‘]] 2915377167816
print(l2,id(l2))  # [1, 2, 3, [‘barry‘, ‘alex‘]] 2915377167048

l1[3][0] = ‘wusir‘
print(l1,id(l1[3]))  # [1, 222, 3, [‘wusir‘, ‘alex‘]] 2915377167240
print(l2,id(l2[3]))  # [1, 2, 3, [‘barry‘, ‘alex‘]] 2915377167304

对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。

原文地址:https://www.cnblogs.com/zsdbk/p/9387658.html

时间: 2024-11-06 09:54:34

python中的深浅Copy的相关文章

Python中的深浅拷贝详解

要说明Python中的深浅拷贝,可能要涉及到下面的一系列概念需要简单说明下: 变量-引用-对象(可变对象,不可变对象)切片-拷贝-浅拷贝-深拷贝 [变量-对象-引用] 在Python中一切都是对象,比如说: 3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用 单独赋值: 比如说: >>> a = 3 在运行a=3后,变量a变成了对象3的一个引用.在

Python中的深浅拷贝

Python中的深浅拷贝 前言:我们在了解深浅拷贝之前首先需要明白的一点知识 不可变类型数据:不可变类型即指当改变其内元素时,内存空间将会发生变化,比如常见的不可变类型有:str,boolean, int,tuple. temp = "哈哈哈" ret = temp.replace("哈", "嘿", 2) print(temp) # 哈哈哈 print(ret) # 嘿嘿哈 # 我们可以看到temp的值并没有发生改变,这就是为什么对str数据改

python列表中的深浅copy

列表中的赋值和平常的赋值是不一样的,看下面的代码: In [1]: a = 1 In [2]: b = a In [3]: a Out[3]: 1 In [4]: b Out[4]: 1 In [5]: id(a) Out[5]: 4452948992 In [6]: id(b) Out[6]: 4452948992 In [7]: id(1) Out[7]: 4452948992 In [8]: a = 4 In [9]: b Out[9]: 1 In [10]: id(a) Out[10]:

Python中的深浅拷贝,赋值及引用

简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷贝 copy.deepcopy()  深拷贝 赋值操作更像是一个引用,新的赋值会创建一个新的内存地址,指向改变了,原来的内存地址还会存在. 参考文章地址: python基础(5):深入理解 python 中的赋值.引用.拷贝.作用域 http://my.oschina.net/leejun2005/

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

python中的深copy和浅copy

bytes Python bytes/str bytes 在Python3中作为一种单独的数据类型,不能拼接,不能拼接,不能拼接 >>> '€20'.encode('utf-8') b'\xe2\x82\xac20' >>> b'\xe2\x82\xac20'.decode('utf-8') '€20' 解码 >>> b'\xa420'.decode('windows-1255') '?20' 深copy和浅copy 深copy新建一个对象重新分配内存

pyhton中的深浅copy

深浅拷贝:数据分离情况 1. =赋值:数据完全共享(指向内存中的同一个对象)被赋值的变量指向的数据和原变量的数据都是指向内存中的同一个地址: (1)如果是不可变数据类型(数字.字符串等),修改其中的一个值,实际是修改了变量指向与值对应的地址(相当于重新被赋值),因此会同时发生变化: (2)如果是可变数据类型(列表.字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变. 1 print("以下是赋值") 2 a=[1,2,&quo

理解一下python中的浅copy和深copy

最近在学习过程中,了解了一下,浅copy和深copy,做个记录. 所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空间 浅拷贝仅仅复制了容器中元素的地址 >>> user = ['tom', ['age', 20]] >>> user_new = us

Python基础之深浅copy

1. 赋值 lst1 = [1, 2, 3, ["a", "b", "c"]] lst2 = lst1 lst1[0] = 11 print(lst1) #[11, 2, 3, ['a', 'b', 'c']] print(lst2) #[11, 2, 3, ['a', 'b', 'c']] lst1[3][0] = "d" print(lst1) #[11, 2, 3, ['d', 'b', 'c']] print(lst2