Python深拷贝和浅拷贝详解,python的深拷贝与浅拷贝
在python中,直接变量赋值和参数传递都是通过引用来赋值的。本文主要介绍Python中引用和复制规律的相关信息,通过示例代码非常详细的介绍。有需要的可以参考一下。
目录
python引用一切。案例1:直接引用。案例二:复制。案例三:深度复制总结。Python的可变性和不变性与各种浅拷贝和深拷贝规则梳理在一起。
Python一切皆引用
在C /Java中,int a=1是创建一个变量a,赋给1;Int=a是创建变量B,赋给A的值,和A B无关,就是“变量是盒子”,但这不利于理解Python中的一个变量定义。在Python中,我们将变量视为“对实际存储的引用”(来源:《流畅的python》)。
所以在python中,a=[1,2,3]先分配一个区域写[1,2,3],然后让A表示;B=a使得B和A代表同一个东西。即使A本身消失了(比如del a),也只是在撕掉一个标签。b仍然可以访问这个列表。其他类型也是如此。
情况一:直接引用
直接引用的意思是B=A,如上所述,不会出现复制,但是B也会表示A表示的区域,此时,B就是A,b[0]就是a[0]。
如果修改了A,说明A指向了其他对象,与链表无关,所以B没有改变;而如果修改一个[0](或者使用=,append等。),列表被修改,b[0]也在变化。
但是对于不可变的对象比如单个数字或者元组字符串,你也可以使用=,但是不支持原地修改,所以你实际上会调用a=a b来获得一个新的对象。A=(1,2,3);b=a;A=(4,5)。此时执行a=a (4,5),已经指向新值,所以B不会改变。
情况二:复制
有时我们只编辑列表或字典的副本,所以我们需要复制它们。通常,最常见的复制方法有:
b=a[:]
b=列表(_ for _ in a)
b=副本(a)
b=a.copy()
这些都叫浅抄。浅抄的时候发生了什么?
浅层复制的逻辑会创建一个新对象,然后将每个值的副本复制到新对象中,这需要一个线性的时间。可以看出,复制后B与A相同,但A是B不再有效,a[0]和b[0]不再是相关值。可以随意修改列表B,没有一个会影响A中的四个元素(红蓝橙绿四个小圆圈)。
情况三:深复制
然而,浅层复制仍然存在一些无法解决的问题。我们知道所有东西都是用python引用的。图中的小圆圈不是盒子而是标签!虽然A和B是分开的,但是如果一个元素还是列表,那么实际上是连在一起的。
如图,浅拷贝时执行了b[1]=a[1],但是b[1]和a[1]是引用,所以还是通过它们访问同一个变量序列。修改a[1]不会导致b[1]改变,但是修改a[1][0]会导致b[1][0]改变。
所以我们引入深度拷贝来解决这个问题:
从副本导入深层副本
a=[1,[1,2,3],你好]
b=深层拷贝(a)
复制的深层逻辑是将每个值复制到一个新的对象中,如果这个项目也表示一个变量迭代对象(列表、字典、没有特殊定制的自定义类),那么也复制这个对象。这样你就能得到一份完整的拷贝。
总结
这篇关于Python中引用和复制规律的文章到此为止。有关Python引用和复制的更多信息,请搜索热门IT软件开发工作室之前的文章或继续浏览下面的相关文章。希望大家以后多多支持热门IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。