python中的拷贝

再说拷贝之前先说一说 is 与 ==

is 的作用是 比较两个引用是否为一个地址

== 是比较两个值

对变量 a  变量 b  都赋值为 2 : a 与 b 的值相等我们都可以理解,但是a与b引用地址也相同是为什么呢?

a和b中实际存储的就是一条地址,因为都赋值为2,所以就都存了内存单元中2的地址。也就是说如果增加一个变量c ,另c=a或c=b,那么c也指向的是2的内存地址;

接下来说拷贝,拷贝与 ‘=’ 赋值不同,拷贝是在建立一个空间,与原有的内容断开了联系。

深拷贝与浅拷贝:

进行拷贝首先引入copy模块  import copy

浅拷贝: copy.copy()

例如 a = copy.copy(b)

说到这里可能有人发现了一些小错误,不是说拷贝是另建空间吗?怎么使用了拷贝后 b is a 还是true?

这里有涉及到了python对内存操作中的一点小知识:

在 python 中数字 字符串,元组这些是不可变类型的,他们在内存中如果创建了地址就是固定的,如果另一个变量值也为这些,那么就会指向这个地址而不会再创建。所以即使使用了copy,也还是这个地址。而像列表等可变类型就会是另一种结果:

      

用一个可变类型列表来分别执行浅拷贝与赋值操作这样对比是不是更加容易理解呢

浅拷贝只是对于一个对象的顶层拷贝:

什么是顶层拷贝呢? 举个栗子:

对列表a进行拷贝  ,b 和 a 是一样的

对 a 追加一个元素,b并未发生改变

如果是赋值的话,a变,b也会变。

回到拷贝上我们再对 a 追加一个元素

当对列表a中的列表增加一个元素时,b中的列表也相应增加了。

所以浅拷贝只是对对象的顶层拷贝,并未真正断了所有联系!

深拷贝:copy.deepcopy()

例如 a = copy.deepcopy(b)

深拷贝与浅拷贝的区别就是深拷贝彻底断了所有联系!

再次使用上面的实例演示一下:

由以上操作可以看出,深拷贝是一种底层递归拷贝。

在深拷贝的操作下,a与b之间是完全断了联系的!

时间: 2024-10-15 07:07:53

python中的拷贝的相关文章

Python中深浅拷贝 垃圾回收与 super继承(六)

1 python拷贝 深拷贝,浅拷贝 与引用三者的区别 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(

python中深浅拷贝

在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,["a","b"]] (1)直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变 >>> b=alist>>> print b[1, 2, 3, ['a', 'b']]>>> alist.ap

Python中的拷贝与深浅拷贝

赋值 即为赋值.举个例子 a = 147147 b = a # 赋值 print(a is b) # True 结论:对于通过用 = 号赋值,数字和字符串在内存当中用的都是同一块地址. 浅拷贝 对于浅拷贝,字典.列表.元组等类型,它们只拷贝第一层地址 import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 678]} n3 = copy.copy(n1

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中无论参数传递还是函数返回值,都是进行引用传递.那如何拷贝对象呢,标准库的copy模块提供了两个方法:copy和deepcopy方法. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 见下例: import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 e = a[:] #利用分片操作进行拷贝(浅拷贝) b = a <span style="white-

Python中的赋值和拷贝

赋值 在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本.例如: >>> a=[1,2,3] >>> b=a >>> c=a 对象是[1,2,3],分别由a.b.c三个变量其建立了对应的引用关系.而三个变量都不独占对象[1,2,3],或者说,可以通过任何一个变量来修改[1,2,3]这个对象. >>> c.append(4) >>> c [1, 2, 3, 4] >>> a [

python中的深拷贝和潜拷贝

>>> a = ['ace',['age',10]] >>> b = a[:] >>> c = list(a) >>> for item in a: ... print(id(item)) ... 140281621219736 140281621134800 >>> for item in b: print(id(item)) ... 140281621219736 140281621134800 >>

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

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

python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域

在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针,而不是数据存储区域, 这点和大多数 OO 语言类似吧,比如 C++.java 等 ~ 1.先来看个问题吧: 在Python中,令values=[0,1,2];values[1]=values,为何结果是[0,[...],2]? >>> values = [0, 1, 2] >>> values[1] = values >>> values [0, [.