深、浅copy

深、浅copy多用于列表


浅copy:第一层中不变的数据是独立的,可变类型元素指向同一块内存地址

l1 = [1,2,3,["a","b"]]
l2 = l1.copy()
l1.append(666)
print(l1)
print(l2)
---------
[1, 2, 3, [‘a‘, ‘b‘], 666]
[1, 2, 3, [‘a‘, ‘b‘]]
----------
# print(id(l1),id(l2))  #4335432200 4335434184
# print(id(l1[-1]),id(l2[-1]))  #4335441416 4335441416

打印两个列表的id可以发现两个列表本身的id是不同的,即时两个不同的内存地址,但是对于第二层的列表的id来看,他们是只想同一块内存地址,所以当他们其中任意一个对里面的列表进行增删改等操作,都会反应到两个列表中

深copy:所有的数据都是完全独立

import copy
l1 = [1,2,3,["a","b"]]
l2 = copy.deepcopy(l1)
------------------
print(l2)
print(id(l1),id(l2))
print(id(l1[-1]),id(l2[-1]))
----------------
[1, 2, 3, [‘a‘, ‘b‘]]
4334215048 4334284104
4334275016 4334283080

打印两个列表的id,可以发现两个列表的id不相同,同时打印他们第二层的列表,id也是不相同,这说明他们都是属于不同的内存地址,各自的增删改查是互不影响的。

注意:列表的切片属于浅copy

原文地址:https://www.cnblogs.com/xiayuhao/p/9459628.html

时间: 2024-10-13 16:23:24

深、浅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

【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

(五)聊一聊深Copy与浅Copy

一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可变类型而言,对于不可变类型,无论深浅,值相等,内存地址一样,一旦值发生变化,相当于再创建一个对象. 浅copy有3种方法: a=[1,2,3,["a","b"],22] a1=a[:]  切片操作 a2=list(a)  工厂函数 a3=copy.copy(a)  或