Python深浅拷贝浅析
我们先直接来看下
创建两个字符串,a,b 字面量值都一致
在Python解释器中,是对于变量所对应的值比较
a = "python 123"
b = "python 123"
if a== b:
print("好久不见")
我们创建一个变量c ,将a 的值赋给c,用c is a判断是否是同一个变量,运行看结果
c = a
print(c)
print(c is a)
从结果来看,a 和c都是指向内存空间中的同一个地址的值
- 我们在通过一个迭代对象进行深浅拷贝的进一步理解
- 我们创建了一个列表a ,并将a 赋值给b
- 我们判断a、b是否是同一个对象,应该是的吧,可以参照上边的例子
a = [1,2,3,4]
b =a
print("a :{0} \t b:{1}".format(a, b))
print(b is a)
结果显示也是
- 我们现在对a的第一个元素进行修改
- 将[1,2,3,4] 的第一个元素1 ⇒ \Rightarrow ⇒ 11
a[0] = 11
print("--------------------")
print("a:{0}".format(a))
print("b:{0}".format(b))
结果
但是我们在日常使用中可能只是想操作a,但是b不想随着我们的操作而变化,这时候我们就需要深拷贝,制作一个操作对象的副本进行变量赋值
- 深度拷贝,使用对象[可变对象]的copy()方法进行处理【字符串是不可变对象】
- 对于b我们进行深度拷贝,并修改a列表中 [ 11 , 2 , 3 , 4 ] [11,2,3,4] [11,2,3,4]将2,3,4修改为22,33,44,查看b的值以及a、b是否是同一个对象
# 深度拷贝,使用copy() 方法生成副本并赋值给b
b = a.copy()
a[1:] = [22,33,44]
print("**********************")
print("a:{0}".format(a))
print("b:{0}".format(b))
print(a is b)
结果如下
总结
深度拷贝就是调用对象的copy方法进行对象的副本创建并赋值的一个操作。关于Python的源码的一些逻辑,学习过java的小伙伴可以看看,可Java的逻辑有很多相似之处。