浅拷贝与深拷贝

解释

浅拷贝:只是对对象的一个引用,和被引用的对象指向内存的同一个地址,即拷贝后,值和地址皆相同

深拷贝:不是引用,是将被拷贝的对象的值copy到另外一个新的地址,即拷贝后,值相同,但地址不相同

浅拷贝实例

如果对浅拷贝的对象进行操作,拷贝对象和被拷贝对象的值都会发生变化,因为操作的是同一个内存地址

import copy

list1 = ['a','b',['c','d','e']]

# copy
print('==='*4+ 'copy'+'==='*4)
list2 = copy.copy(list1)

print(f'list1[2]: {list1[2]}, address: {id(list1[2])} ')
print(f'list2[2]: {list2[2]}, address: {id(list2[2])} ')
print('---'*4 + 'after append'+'---'*4)
list1[2].append('f')
print(f'list1[2]: {list1[2]}, address: {id(list1[2])} ')
print(f'list2[2]: {list2[2]}, address: {id(list2[2])} ')

输出结果

============copy============
list1[2]: ['c', 'd', 'e'], address: 60733640 
list2[2]: ['c', 'd', 'e'], address: 60733640 
------------after append------------
list1[2]: ['c', 'd', 'e', 'f'], address: 60733640 
list2[2]: ['c', 'd', 'e', 'f'], address: 60733640 

深拷贝示例

如果对浅拷贝的对象进行操作,拷贝对象和被拷贝对象的值之间不会相互影响,因为操作的是不同的内存地址

#  deep copy
list1 = ['a','b',['c','d','e']]
print('==='*4 + 'deep copy'+'==='*4)
list3 = copy.deepcopy(list1)

print(f'list1[2]: {list1[2]}, address: {id(list1[2])} ')
print(f'list3[2]: {list3[2]}, address: {id(list3[2])} ')
print('---'*4 + 'after append'+'---'*4)
list1[2].append('f')
print(f'list1[2]: {list1[2]}, address: {id(list1[2])} ')
print(f'list3[2]: {list3[2]}, address: {id(list3[2])} ')

输出结果

============deep copy============
list1[2]: ['c', 'd', 'e'], address: 60734840 
list3[2]: ['c', 'd', 'e'], address: 60764072 
------------after append------------
list1[2]: ['c', 'd', 'e', 'f'], address: 60734840 
list3[2]: ['c', 'd', 'e'], address: 60764072 

在Python中对象的赋值其实就是对该对象的一个引用

当我创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。



上一页 下一页