对于数字,字符串,赋值,浅拷贝,深拷贝无意义,因为其永远指向一个内存地址:
下面分别对这些数据类型进行测试
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
对于数字,字符串我们得出的结论是这样的
对于字典、元祖、列表而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
赋值,只是创建一个变量,该变量指向原来内存地址,如:
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
由此可见
浅拷贝,在内存中只额外创建第一层数据
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内部对字符串和数字的优化)
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
由此我们得出