浅深copy

前言

列表中的每个元素在内存中都是相互独立的,有自己的唯一标识符,可以通过 id() 函数来查看元素在内存中的唯一标识符。

浅深copy在列表数据量比较大的情况下,不建议使用,比较消耗内存资源。

浅深copy就是在内存中把一个列表复制一份,占用了两份内存空间:

浅copy

元素值未修改

两个列表的唯一标识符不一样,元素的唯一标识符是一样的(两个列表共享一份元素值)。

元素值修改后

元素的唯一标识符改变,但是有子列表的情况下,子列表元素唯一标识符不改变。

总结:并非完全独立的两个列表。

深copy

元素值未修改

两个列表的唯一标识符不一样,元素的唯一标识符是一样的,子列表的元素唯一标识符不一样。

元素值修改后

元素的唯一标识符不一样,子列表的元素唯一标识符不一样。

总结:完全独立的两个列表。

names1 = [‘xiaoming‘,[‘xiaobai‘,18]]
names2 = names1.copy()  # 浅copy
print(‘names1=‘,names1,‘唯一标识符是‘,id(names1))
print(‘names1列表的元素1的唯一标识符是‘,id(names1[0]),‘元素2的唯一标识符是‘,id(names1[1]))
print(‘\n‘)
print(‘浅copy后names2的执行结果:‘)
print(‘names2=‘,names2,‘唯一标识符是‘,id(names2))
print(‘names2列表的元素1的唯一标识符是‘,id(names2[0]),‘元素2的唯一标识符是‘,id(names2[1]))
print(‘\n‘)
names2[0] = ‘小明‘
names2[1][0] = ‘小白‘
print(‘names2元素值修改后的执行结果:‘)
print(‘names2=‘,names2,‘唯一标识符是‘,id(names2))
print(‘names2列表的元素1的唯一标识符是‘,id(names2[0]),‘元素2的唯一标识符是‘,id(names2[1]))

import copy     #深copy
names3 = copy.deepcopy(names1)
print(‘\n‘)
print(‘深copy后names3的执行结果:‘)
print(‘names3=‘,names3,‘唯一标识符是‘,id(names3))
print(‘names3列表的元素1的唯一标识符是‘,id(names3[0]),‘元素2的唯一标识符是‘,id(names3[1]))

names3[0] = ‘小刚‘
names3[1][0] = ‘小李‘
print(‘\n‘)
print(‘names3元素值修改后的执行结果:‘)
print(‘names3=‘,names3,‘唯一标识符是‘,id(names3))
print(‘names3列表的元素1的唯一标识符是‘,id(names3[0]),‘元素3的唯一标识符是‘,id(names3[1]))

names1= [‘xiaoming‘, [‘xiaobai‘, 18]] 唯一标识符是 2511119409800
names1列表的元素1的唯一标识符是 2511120629936 元素2的唯一标识符是 2511119409736

浅copy后names2的执行结果:
names2= [‘xiaoming‘, [‘xiaobai‘, 18]] 唯一标识符是 2511120630024
names2列表的元素1的唯一标识符是 2511120629936 元素2的唯一标识符是 2511119409736

names2元素值修改后的执行结果:
names2= [‘小明‘, [‘小白‘, 18]] 唯一标识符是 2511120630024
names2列表的元素1的唯一标识符是 2511121340616 元素2的唯一标识符是 2511119409736

深copy后names3的执行结果:
names3= [‘xiaoming‘, [‘小白‘, 18]] 唯一标识符是 2511121609480
names3列表的元素1的唯一标识符是 2511120629936 元素2的唯一标识符是 2511121470152

names3元素值修改后的执行结果:
names3= [‘小刚‘, [‘小李‘, 18]] 唯一标识符是 2511121609480
names3列表的元素1的唯一标识符是 2511121340792 元素3的唯一标识符是 2511121470152

原文地址:https://www.cnblogs.com/lipandeng/p/9606108.html

时间: 2024-10-24 15:46:31

浅深copy的相关文章

python学习笔记-(六)深copy&浅copy

在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 1. 赋值 赋值其实只是传递对象引用,引用对象id是一样的.原始列表改变,被赋值的b也会做相同的改变. 1 2 3 4 5 6 7 8 9 10 11 12 13 >>> alist = [1,2,3,["a","b"]] >>> b = alist >>> p

python 深复制与浅复制------copy模块

模块解读: 浅复制: x = copy.copy(y)深复制: x = copy.deepcopy(y)(注:模块特有的异常,copy.Error) 深copy与浅copy的差别主要体现在当有混合对象时,即在一个对象中包含其他子对象,比如在一个字典中的一个value是一个列表,这时:浅copy,没有拷贝子对象,所以原始数据改变,子对象会跟着改变.深copy,包含拷贝对象中对子对象的拷贝,也就是说原始数据改变,子对象不会随之改变. 举个例子:info = { 'name':'webber', 'j

【C/C++学院】(6)构造函数/析构函数/拷贝构造函数/深copy浅copy

1.构造函数 类的初始化即为构造函数.也为:隐式的初始化. 构造函数在对象初始化的时候,自动被调用.隐式的调用. 构造函数分为三种:有参构造函数.无参构造函数.拷贝构造函数. 有参构造函数调用有三种:括号法.等号法.手工法. #include <iostream> using namespace std; class Test { private: int m_a; public: Test()//无参构造函数 { } Test(const Test &obj)//拷贝构造函数 { }

python基础之赋值/深copy/浅copy

首先,不管是赋值还是深浅copy,都是针对那些可能会产生变化的值进行区分的,也就是对于数字,字符串来说,区分赋值,深浅copy是毫无意义的. 那么,让我们来对那些可变的像list set dict tuple……来进行探讨. 赋值: 有两种修改n的方法: 1  直接对n赋值 >>> n=[1,2] >>> g=n >>> id(n) 140529062430792 >>> id(g) 140529062430792 >>&

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

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

列表的使用2,深COPY和浅COPY,循环列表,步长切片

name2=names.copy() 下面我看几种奇怪的现象: 首先把源列表copy以后,把源列表第2个数值修改.那么没毛病. 如果源列表里,还包含了一个子列表:这也没毛病 如果我们这个时候修改子列表的数值.我们来看一个神奇的现象: copy是一种浅COPY,它只会COPY第一层的数据,而不会深入COPY.只会COPY子列表的内存指针,内存地址. 如果你不用COPY的方法,那问题会更严重: 结果是这样的,连浅COPY都不如:相当于只把列表的内存地址复制了一下: 简单来说就是这种情况. 但是如果是

浅copy 与 深copy

1 import copy 2 names = ["zhangyang", 'guyun', 'xiangpeng', ['jack','tom'], 'xuliangchen'] 3 names2 = names.copy() #浅copy,复制后改变原列表,copy后的列表不发生改变 4 5 6 names[2] = "祥鹏" 7 names.append("zhangshan") 8 9 print(names) 10 print(name

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新建一个对象重新分配内存

关于iOS的深copy和浅copy 以及copy 和 strong 的区别

之前都是靠记忆来维持copy和strong  也有问过我 .  我自己说起来才感觉都说不很清楚 通过简单都代码来验证一下 . 有时候花点时间验证一下才能让思路更加清晰 NSMutableString * mustr = [NSMutableString stringWithString:@"good"]; self.str = mustr; self.fuzhiString = mustr; NSLog(@"self.str is (%@) ==== str,self.fuz