python赋值,浅拷贝与深拷贝的区别
程序员文章站
2022-05-19 15:18:20
...
赋值:
传递对象的引用,原始对象改变时,被赋值的变量也做相同的改变。
a=[1,2,3]
b=a
a.append(4)
print(a)
print(b)
a改变,输出结果为:
[1, 2, 3, 4]
[1, 2, 3, 4]
若b改变:
b.append(5)
print(a)
print(b)
输出结果为:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
即原始对象和被赋值的变量会相互影响。
浅拷贝copy
拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的子对象不复制,当对象中引用的子对象改变时,新对象中相应的子对象也会改变。
import copy
c=['a','b','c',[1,2]]
d=copy.copy(c)
c.append('d')
print(c)
print(d)
输出结果为:
['a', 'b', 'c', [1, 2], 'd']
['a', 'b', 'c', [1, 2]]
由于浅拷贝只复制外围的对象,所以c增加一个元素,d并不改变。
但如果c中引用的子对象改变,d中的子对象也会改变。
c[3].append(3)
print(c)
print(d)
输出结果为:
['a', 'b', 'c', [1, 2, 3], 'd']
['a', 'b', 'c', [1, 2, 3]]
深拷贝deepcopy
深拷贝不仅仅拷贝了原始对象自身,也对其包含的值进行拷贝,它会递归的查找对象中包含的其他对象的引用,来完成更深层次拷贝。因此,深拷贝产生的副本可以随意修改而不需要担心会引起原始值的改变。
import copy
e=['a','b','c',[1,2]]
f=copy.deepcopy(e)
e.append('d')
print(e)
print(f)
输出结果为:
['a', 'b', 'c', [1, 2], 'd']
['a', 'b', 'c', [1, 2]]
原始数据的外围对象改变,深拷贝产生的副本不变;即使原始数据引用的子对象改变,也不会影响到副本。
e[3].append(3)
print(e)
print(f)
输出结果为:
['a', 'b', 'c', [1, 2, 3], 'd']
['a', 'b', 'c', [1, 2]]
上一篇: 字符串的常用方法总结
下一篇: 婚姻幸福的5个关键词