Python深拷贝和浅拷贝详解,Python深浅拷贝
Python浅拷贝和深拷贝的详细说明首先我们要了解一下浅拷贝和深拷贝的概念:
1.浅拷贝定义:浅拷贝是对另外一个变量的拷贝内存地址。这两个变量指向同一个内存地址的变量值。
注意:只复制目标变量的地址,目标变量的地址不变。
其实变量里并没有存储任何值,只是指向了一个内存地址,具体的内容就存储在这个地址里。比如把变量A赋给变量B,实际上是把内存中A到一个对象的链接赋给了B,也就是说现在A和B都指向同一个对象。所以在内存中更改了array的值后,A和B都引用了array对象,所以都一起更改了。
轻抄特点:公用一个值;这两个变量的内存地址一样;对其中一个变量的值改变,另外一个变量的值也会改变;2。深度复制定义:一个变量对另外一个变量的价值复制。
注意:复制的目标变量的值是一个真实的副本,新的变量产生一个新的内存地址。
深度复制的特点:变量的内存地址不同;变量各有自己的值,且互不影响;对其任意一个变量的值的改变不会影响其余变量的值;3。在Python中,另一个直接赋给列表数据的变量是浅拷贝。
操作是深拷贝。
#Python中的# shallow Copy a=[1,2,3,4,5,6]b=a #a直接赋值bprint(a的初始内存地址:,id(a))print(b的初始内存地址:,Id(B))B . append(7)# B)print( a的当前内存地址:,id(a))print(b的当前内存地址:,Id (b)) print ( - ) c=a [0: 3] # c复制用c. C)print(a的内存地址:,id(a))print(b的内存地址:,id(b))print(c的内存地址:,id(c))# print C的内存地址 A的初始内存地址:2186126011016b。7]b: [1,2,3,4,5,6,7]a的当前内存地址:2186126011016b的当前内存地址:2186126011016 -。7,9]c: [1,2,3,8]a的内存地址:2186126011016b的内存地址:2186126011016c的内存地址:2186126011976 很明显,浅拷贝后变量的存储地址是一样的,只是拷贝到内存地址,增加或删除了其中一个变量。
深度复制变量的不同存储地址表明已经打开了一个新的内存空间来存储复制的变量,添加或删除一个变量不会影响其他变量。
4.numpy中深度复制和轻复制的np.copy()方法是深拷贝;切片专用浅拷贝;(注意python使用list slice是深度拷贝,是一种特殊的浅拷贝,因为出现了新的内存地址,但是数据修改还是会同步。)对另一个变量的直接赋值是浅拷贝。# import numpy import numpy as NPA=NP . orange(6)print( I,light copy) #1、直接赋值方法b=a#2、切片方法c=a [:] print (a:,a) print (b:,B: C:)C)print( 3354—在B的第1个位置更改元素后)#更改A中第一个元素的值A [0]=4C [2]=7print (A:,A,ID (A)) 深层复制)d=a.copy () print (a:,a) print (d:,d) #更改A的第二个元素的值也是a[1]=5print(赋值后:)print (a:) Id(d) I、轻度复制a: [0 1 2 3 4 5]b: [0 1 2 3 4 5]c: [0 1 2 3 4 5]更改B的第一个位置的元素后,3354—A:[4 1 7 3 4 5]2186126045 会发现存储地址变了,但是A和C还是会互相影响,所以这是一个特殊的浅拷贝。二。深抄a: [4 1 7 3 4 5]d: [4 1 7 3 4 5]赋值后:A:[457345]2186126040480d:[417345]2186125987392
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。