Python:深浅拷贝

导入模块:

>>> import copy

深浅拷贝:

>>> X = copy.copy(Y) #浅拷贝:只拷贝顶级的对象,或者说:父级对象
>>> X = copy.deepcopy(Y) #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

例:

>>> D = {‘name‘:‘jack‘,‘age‘:20}
>>> C1 = copy.copy(D)
>>> C2 = copy.deepcopy(D)
>>> id(D);id(C1);id(C2)
53035208
53611144
53610248
>>> D[‘name‘] = ‘tom‘   #改变源
>>> D;C1;C2
{‘age‘: 20, ‘name‘: ‘tom‘}
{‘age‘: 20, ‘name‘: ‘jack‘}
{‘age‘: 20, ‘name‘: ‘jack‘}

如果有嵌套:

D = {‘name‘:{‘first‘:‘john‘,‘last‘:‘lee‘},‘job‘:[‘IT‘,‘HR‘]}
>>> C1 =  copy.copy(D)
>>> C2 = copy.deepcopy(D)
>>> D;C1;C2
{‘job‘: [‘IT‘, ‘HR‘], ‘name‘: {‘first‘: ‘john‘, ‘last‘: ‘lee‘}}
{‘job‘: [‘IT‘, ‘HR‘], ‘name‘: {‘first‘: ‘john‘, ‘last‘: ‘lee‘}}
{‘job‘: [‘IT‘, ‘HR‘], ‘name‘: {‘first‘: ‘john‘, ‘last‘: ‘lee‘}}
>>> id(D);id(C1);id(C2)
53018568
53611592
53610056
>>>
>>> D[‘job‘][0] = ‘RRRR‘   #修改其中一个元素
>>> D;C1;C2
{‘job‘: [‘RRRR‘, ‘HR‘], ‘name‘: {‘first‘: ‘john‘, ‘last‘: ‘lee‘}}
{‘job‘: [‘RRRR‘, ‘HR‘], ‘name‘: {‘first‘: ‘john‘, ‘last‘: ‘lee‘}}
{‘job‘: [‘IT‘, ‘HR‘], ‘name‘: {‘first‘: ‘john‘, ‘last‘: ‘lee‘}}

#结论:
(1)深浅拷贝都是对源对象的复制,占用不同的内存空间
(2)如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
(3)如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
(4)序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

时间: 2024-10-16 11:42:50

Python:深浅拷贝的相关文章

python 深浅拷贝 进阶

主要理解新与旧到底在哪里 这样也就理解了 深浅拷贝 先说说赋值,其实python中的赋值其实是赋值了一个引用,例如: foo1=1.0 foo2=foo1 用操作符is判断时,你可以发现结果是true,是因为python是先创建了一个对象1.0,然后这个对象的引用又被赋值给了foo1和foo2,但是如果是这样: foo1=1.0 foo2=1.0 这时你会发现,这其实是创建了两个不同的对象,用内建函数id()可以发现,二者的身份不同: 其实python还有一个特例,例如: a=1 b=1 你会发

Python开发【第二章】:Python深浅拷贝剖析

Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 创建列表变量Alex,变量包含子列表,通过变量Alex给变量lzl赋值,对

8.6(数据类型分类,python深浅拷贝,异常处理,基本的文件操作,绝对路径和相对路径)

数据类型分类 按照存值个数: 存一个值:整型/浮点型/字符串 存多个值:列表/字典/元组/集合 按照有序和无序: 有序:字符串/列表/元组 无序:字典/集合 按照可变和不可变 可变:字典/列表/集合 不可变:整型/浮点型/字符串/元组 Python深浅拷贝 # 拷贝 赋值 # lt = [1,2,3] # lt2 = lt # lt.append(4) # print(lt) # print(lt2) # 列表为可变类型,所以lt的值变化,lt2的值也会跟着变化 # 浅拷贝 # import..

Python深浅拷贝

深浅拷贝 深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表.元组.字典等其他数据类型. 数字和字符串 对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址. # 导入copy模块>>> import copy# 定义一个变量var1>>> var1 = 123# 输出var1的内存地址>>> id(var1)1347747440>>> var2 = var1# var2的内存地址和var1相同

Python 深浅拷贝 (Shallow copy and Deep copy in Python)

前言 昨天刷公众号看到一篇描述py优雅语法的文章,心痒之下到家就开始尝试,学习了for else statement,yield和py版三目写法.在列表切片这部分中,对作者的列表拷贝写法,有些不太理解. # 拷贝 copy_items = items[::] 或者 items[:] 尝试 首先开一个python,随便建一个列表l=[1,2,3]将其进行两种方法的拷贝: 我的写法 c=l 作者的写法 d=l[:] 分别打印了c和d,并没有什么差别,仔细斟酌了一下作者的用意,觉得应该有一些深层次的考

python深浅拷贝以及数据在内存中储存方法

要搞懂深浅拷贝,首先要明白数据在内存里的储存方法. 一个变量的储存,首先是变量名加上储存内容的ID,通过ID去找到变量名所对应的内容, 当我们对数据进行赋值时,其实是把内容的整体地址赋给别的变量名(相当于复制一层ID) 然而当使用浅copy时,相当于把整体内容的地址与内容中第一层地址给复制(相当于复制两层ID) 应用:直接在变量名后加一个.copy(),或import调用copy模块使用模块中的方法copy.copy() 深度拷贝,其实是复制的整体以及整体内的所有ID(复制所有层ID) 方法是用

python深浅拷贝,集合以及数据类型的补充

1.基础数据类型的补充 1.元组 如果元组中只有一个数据,且没有逗号,则该'元组'与里面的数据的类型相同.如: 1 tu = (1) 2 tu1 = (1,) 3 tu2 = ('alex') 4 tu3 = ([1,2,3],) 5 print(tu,type(tu)) # 1 <class 'int'> 6 print(tu1,type(tu1)) # (1,) <class 'tuple'> 7 print(tu2,type(tu2)) # alex <class 's

python深浅拷贝的理解和区分

1 import copy 2 3 a1 = ['s1','s2','s3'] 4 5 #可变数据类型 6 a = [1,2,a1] 7 8 b = a 9 a1.append('s4') 10 #浅拷贝 11 c = copy.copy(a) 12 #深拷贝 13 d = copy.deepcopy(a) 14 15 #可变数据类型打印 16 print('值打印----:') 17 print(a1) 18 print(a) 19 print(b) 20 print(c) 21 print(

python 深浅拷贝

先定义一个列表 >>> s = [1,'alex','alvin'] >>> s2 = s.copy() 使用copy()方法拷贝,创建一个新的对象s2 >>> print(s2) 拷贝之后s2对象和s对象的内容一样. [1,'alex','alvin'] >>> s2[0] = 3 修改s2对象的值 >>> print(s2) [3,'alex','alvin'] 打印s2,发现s2对象的值发生了变化 >&g

Python——深浅拷贝

1.赋值操作两者是同一数据,其内存地址一样 2.copy是浅拷贝,只能拷贝嵌套数据的第一层数据,嵌套的数据与赋值操作相同,其内存地址一样,当一个被更改,其他的拷贝也会跟着变. 3.deepcopy是深拷贝,使用深拷贝需要引入copy库,深拷贝是将元素内部的所有元素完全进行拷贝赋值,即使是嵌套数据,其嵌套的数据也是可以复制的,所以原数据改变,拷贝的数据不会跟着变. 原文地址:https://www.cnblogs.com/heshike/p/9432239.html