python深拷贝指的是什么

  介绍

小编给大家分享一下python深拷贝指的是什么,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!

<强> python浅拷贝

常见的浅拷贝的方法,是使用数据类型本身的构造器,比如下面两个例子:

list1 =, (1, 2, 3]   时间=list2 列表(list1)   打印(用于)   打印(“list1==list2  ?“, list1==用于)   print (“list1  is  list2  ?“, list1  is 用于)   set2=中的,集([1,2,3])   时间=set2 集(set2)中的   print ()   打印(“set2==set2 中的?“,set2==)中的   print (“set1  is  set2  ?“, set1  is )

运行结果为:

[1,2,3]   list1==list2  ?,真的   list1  is  list2  ?假   {1,,2,,3}   set2==中的set2  ?,真的   set1  is  set2  ?,假

在上面程序中,用于就是list1的浅拷贝,同理关于我校是set2的中的浅拷贝。

当然,对于可变的序列,还可以通过切片操作符”:“来完成浅拷贝,例如:

list1 =, (1, 2, 3]   时间=list2  list1 [:]   打印(用于)   打印(“list1 ==, list2  ?“, list1 ==,用于)   print (“list1  is  list2  ?“, list1  is 用于)

运行结果为:

[1,2,3]   时间==list1  list2  ?,真的   list1  is  list2  ?,假

除此之外,Python还提供了对应的函数copy.copy()函数,适用于任何数据类型。其用法如下:

import 副本   list1 =, (1, 2, 3]   时间=list2  copy.copy (list1)   打印(用于)   打印(“list1 ==, list2  ?“, list1 ==,用于)   print (“list1  is  list2  ?“, list1  is 用于)

运行结果为:

[1,2,3]   时间==list1  list2  ?,真的   list1  is  list2  ?,假

不过需要注意的是,对于元组,使用元组()或者切片操作符& # 39;:& # 39;不会创建一份浅拷贝,相反它会返回一个指向相同元组的引用:

tuple1 =, (1,, 2,, 3)   时间=tuple2 元组(tuple1)   打印(tuple2)   打印(“tuple1 ==, tuple2  ?“, tuple1 ==, tuple2)   print (“tuple1  is  tuple2  ?“, tuple1  is  tuple2)

运行结果为:

(1,,2,,3)   时间==tuple1  tuple2  ?,真的   tuple1  is  tuple2  ?,真正的

此程序中,元组(1、2、3)只被创建一次,t1和t2同时指向这个元组。

看到这里,也许你可能对浅拷贝有了初步的认识。浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。

对数据采用浅拷贝的方式时,如果原对象中的元素不可变,那倒无所谓;但如果元素可变,浅拷贝通常会出现一些问题,例如:

list1 =,[[1, 2],(30岁,40))   时间=list2 列表(list1)   list1.append (100)   print (“list1:“list1)   print(“用于:“,用于)   list1 [0] .append (3)   print (“list1:“list1)   print(“用于:“,用于)   list1 [1], +=, (50, 60)   print (“list1:“list1)   print(“用于:“,用于)

运行结果为:

list1:,[[1, 2],(30岁,40),100年)   用于:[[1,2],(30岁,40))   list1:[[1, 2, 3],,(30岁,40岁),100年)   用于:[[1,2,3],,(30岁,40))   list1:[[1, 2, 3],,(30岁,40岁,50岁,60岁),,100年)   用于:[[1,2,3],,(30岁,40)]

此程序中,首先初始化了list1列表,包含一个列表和一个元组,然后对list1执行浅拷贝,赋予用于。因为浅拷贝里的元素是对原对象元素的引用,因此用于中的元素和list1指向同一个列表和元组对象。

接着往下看,list1.append(100)表示对list1的列表新增元素100。这个操作不会对用于产生任何影响,因为用于和list1作为整体是两个不同的对象,并不共享内存地址。操作过后用于不变,list1会发生改变。

再来看,list1 [0] .append(3)表示对list1中的第一个列表新增元素3。因为用于是list1的浅拷贝,用于中的第一个元素和list1中的第一个元素,共同指向同一个列表,因此用于中的第一个列表也会相对应的新增元素3 .

最后是list1[1] +=(50、60),因为元组是不可变的,这里表示对list1中的第二个元组拼接,然后重新创建了一个新元组作为list1中的第二个元素,而用于中没有引用新元组,因此用于并不受影响。

python深拷贝指的是什么