1. 苏葳的备忘录首页
  2. 编程

Python的引用和深层拷贝

python list copy引用是Python语言动态性的基础之一,但引用也带来了一些副作用。Python中的对象均以引用方式访问,比如一个列表对象:a1=[1,2,3],然后定义列表对象:a2=[5,a1,’99’]。此时若修改a1的值:a1[1]=20,则a1=[1,20,3]。而此时print a2则会显示出[5,[1,20,3],’99’]。这种由引用导致的链式反应在某些情形下是非预期的,会带来一些困扰。对于例中的情况,列表的切片操作可以部分解决这个问题:

我们用如下方式定义a2列表:a2=[1,a1[:],’99’]。此时,在a1列表修改时,不会影响a2的值,因为切片操作复制了一个列表对象,与原对象脱离了关系。字典有dict.copy()方法,与此类似。另外内置函数list(a1)也会产生一个列表的拷贝。 但是无上下标的切片和字典的的copy方法,都只能进行顶层拷贝,即,若拷贝的对象中嵌套有更深一层结构,那么不会被拷贝,即还是指向先前的引用。 若要实现完整的拷贝(深层拷贝),可引入copy模块:import copy x=copy.deepcopy(z),来递归拷贝对象中的所有结构。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/432.html

发表评论

邮箱地址不会被公开。 必填项已用*标注