一、引言
Python是一种高级编程语言,它的特点之一是变量定义时不需要提前声明,而是在使用时为变量赋值。
a=[1,[2,3],3]
print(id(a))#输出:2588588858240
在计算机内存中,系统给每个变量分配一个空间,这个空间就是对象存储的位置。对象可以是数字、字符串等不同的类型,例如数字是int类型,字符串是str类型。在Python中,赋值语句总是建立对象引用,而不是复制对象本身。
二、浅拷贝(copy)
在Python中,赋值符号“=”只是将对象进行了引用,而不是进行对象的复制。如果想要进行对象的复制,可以使用copy模块的copy函数。
import copy
a=[1,[2,3],3]
b=copy.copy(a)
print(id(a)==id(b),id(a),id(b))#输出:False 2588588858240 2588625243968
以上代码将列表a进行了浅拷贝,得到了变量b。此时,id(a)!=id(b),也就是说a和b是两个独立的对象,但是这两个对象中的数据仍然是引用,如a[0]是b[0]指向的同一对象。即,copy模块的copy函数是浅拷贝:拷贝父对象,但不会拷贝对象的内部子对象。
下面是浅拷贝的示意图:
三、深拷贝(deepcopy)
如果要完全拷贝对象包括子对象,可以使用copy模块的深度拷贝函数deepcopy进行对象的深拷贝。
import copy
a=[1,[2,3],3]
c=copy.deepcopy(a)
print(id(a)==id(c),id(a),id(c))#输出:False 2588588858240 2588628382208
以上代码将列表a进行了深拷贝,得到了变量c。此时,c完全拷贝了a的父对象及其子对象,因此a和c是完全独立的。具体如下图所示:
总结,浅拷贝和深拷贝是Python中常用的对象复制方法,开发者在编写代码时应根据具体情况选择使用哪种方法。同时,对于复杂的数据类型和嵌套结构,深拷贝更适合保留数据信息。