python浅拷贝与深拷贝

时间:2021-08-06 22:19:47

对于数字,字符串,赋值,浅拷贝,深拷贝无意义,因为其永远指向一个内存地址:

下面分别对这些数据类型进行测试

importcopy

######## 数字
a = 1
a1 = a                 ###赋值
a2 = copy.copy(a)      ###浅拷贝
a3 = copy.deepcopy(a)  ###深拷贝

 

打印a ,a1 ,a2,a3的内存地址

######## 打印内存地址
print("a",id(a))       ### 原始a 的内存地址
print("a1",id(a1))     ### a 赋值给a1 以后的内存地址
print("a2",id(a2))     ### a2 浅拷贝a 以后的内存地址
print("a3",id(a3))     ### a3 浅拷贝a 以后的内存地址

 

结果显示 a = a1 = a2 = a3 的内存地址

a1448792528
a11448792528
a21448792528
a31448792528

字符串

s = "this is test str"   ### 原始字符串
s1 = s                      ### s赋值给s1
s2 = copy.copy(s)           ### s2 浅拷贝 s
s3 = copy.deepcopy(s)       ### s3 深拷贝 s

 

打印内存地址

######## 打印内存地址
print("s",id(s))       ### 原始s 的内存地址
print("s1",id(s1))     ### s 赋值给s1 以后的内存地址
print("s2",id(s2))     ### s2 浅拷贝s 以后的内存地址
print("s3",id(s3))     ### s3 浅拷贝s 以后的内存地址

 

结果同样显示 s = s1 = s2 = s3 的内存地址

s44656688
s144656688
s244656688
s344656688


对于数字,字符串我们得出的结论是这样的

python浅拷贝与深拷贝

 

 

对于字典、元祖、列表而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

赋值,只是创建一个变量,该变量指向原来内存地址,如:

d = {"k1": "好好学习", "k2": 123, "k3": ["li", 456]}
d1
= d

 

输出内存地址

######## 打印内存地址
print("d",id(d))                ### 原始d 的内存地址
print("d1",id(d1))              ### d 赋值给d1 以后的内存地址
print("d[k1]",id(d['k1']))     ### 以下取values 做对比
print("d1[k1]",id(d1['k1']))
print("d[k3]",id(d['k3']))
print("d1[k3]",id(d1['k3']))

 

输出结果

d40608192
d140608192
d[k1]40830528
d1[k1]40830528
d[k3]41096576
d1[k3]41096576

由此可见

python浅拷贝与深拷贝

浅拷贝,在内存中只额外创建第一层数据

d = {"k1": "好好学习", "k2": 123, "k3": ["天天向上", 456]}
d1
= d
d2
= copy.copy(d)       ### 浅拷贝

 

print 打印

######## 打印内存地址
print("d",id(d))                ### 原始d 的内存地址
print("d2",id(d2))              ### d 赋值给d2 以后的内存地址
print("d[k1]",id(d['k1']))     ### 以下取values 做对比
print("d2[k1]",id(d2['k1']))
print("d[k3]",id(d['k3']))
print("d2[k3]",id(d2['k3']))

 

结果发现 d = d2 但values 确不相竺

d44409280
d244670168
d[k1]44656688
d2[k1]44656688
d[k3]44893568
d2[k3]44893568

由此得出

python浅拷贝与深拷贝


深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

d = {"k1": "好好学习", "k2": 123, "k3": ["天天向上", 456]}
d1
= d
d2
= copy.copy(d)
d3
= copy.deepcopy(d)    ### 深拷贝

 

print 输出

######## 打印内存地址
print("d",id(d))                ### 原始d 的内存地址
print("d3",id(d3))              ### d 赋值给d2 以后的内存地址
print("d[k1]",id(d['k1']))     ### 以下取values 做对比
print("d3[k1]",id(d3['k1']))
print("d[k3]",id(d['k3']))
print("d3[k3]",id(d3['k3']))

 

结果发现第一层d = d3 k1的值属于原始字符串 d[k1] = d3[k1] 而d[k3] 确不等于d3[k3] 中间一层

d40018368
d340018608
d[k1]44787760
d3[k1]44787760
d[k3]45024640
d3[k3]44981424

由此我们得出

python浅拷贝与深拷贝