欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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]]