小编给大家分享一下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中的第二个元素,而用于中没有引用新元组,因此用于并不受影响。