python

来源:互联网 发布:linux 注销登录用户 编辑:程序博客网 时间:2024/06/07 14:49

浅拷贝:只拷贝地址,不拷贝内容
深拷贝:只拷贝内容, 不拷贝地址

以下直接举例说明

粟子 一

a = [11, 22, 33]b = a # 浅拷贝print(id(a))print(id(b))

打印结果

44911541844491154184

直接将一个变量赋值给另一个变量为浅拷贝,a与b都指向同一块内存地址

粟子 二

import copya = [11, 22, 33]b = copy.deepcopy(a)print("a的地址:%s  a = %s"%(id(a),a))print("b的地址:%s  b = %s"%(id(b),b))

打印结果

a的地址:4352090888  a = [11, 22, 33]b的地址:4352091016  b = [11, 22, 33]

copy. deepcopy为深拷贝

粟子 三

import copya = [11, 22, 33]b = [44, 55, 66]c = [a, b]d = copy.deepcopy(c)a.append(123)print("c的地址:%s  c的a值:%s"%(id(c), c[0]))print("d的地址:%s  d的a值:%s"%(id(d), d[0]))

打印结果

c的地址:4407994888  ca值:[11, 22, 33, 123]d的地址:4407993800  da值:[11, 22, 33]

从打印的结果可以看出,d与c的地址不一样,d中的a与c中的a不一样,说明了copy.deepcopy()的深拷贝是递归拷贝,将变量中所引用的变量也进行内容上的拷贝

粟子 四

import copya = [11, 22, 33]b = [44, 55, 66]c = [a, b]d = copy.copy(c)a.append(123)print("c的地址:%s  c的a值:%s"%(id(c), c[0]))print("d的地址:%s  d的a值:%s"%(id(d), d[0]))

打印结果

c的地址:4464011784  ca值:[11, 22, 33, 123]d的地址:4464010696  da值:[11, 22, 33, 123]

d与c的地址不一样,但是d中的a与c中的a一样,说明了copy.copy()的只进行第一层的深拷贝

粟子 五

import copya = [11, 22, 33]b = [44, 55, 66]c = (a, b)d = copy.copy(c)print("c的地址:%s"%(id(c)))print("d的地址:%s"%(id(d)))a.append(123)print("c中的a: %s"%(c[0]))print("d中的a: %s"%(d[0]))

打印结果

c的地址:4546477576d的地址:4546477576c中的a: [11, 22, 33, 123]d中的a: [11, 22, 33, 123]

使用copy.copy()拷贝一个不可变类型的变量时为浅拷贝,如果拷贝变量为可变类型时则只深拷贝第一层

原创粉丝点击