赞
踩
本文主要参考这篇博文python浅拷贝与深拷贝
首先了解python中的一些基本概念
深浅拷贝主要与可变对象和不可变对象有关,可变对象表明其指向内存中的值可以改变,当修改变量值时,其指向的内容空间中的值直接修改,并没有开辟新地址;不可变对象改变后,其所指的值不能被改变,相当于“抛弃”了原来地址中的值,重新开辟了一块地址进行赋值,并指向该地址
对象的拷贝主要有三种方法
可变对象有列表、字典和集合,下面展示一个例子: 例子来源
字典的浅拷贝
>>> a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
字典的深拷贝
>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
深浅拷贝的图示解释如下
其中红色部分代表两个变量的共有部分,即修改一个另一个也随之变化;黑色部分是独立部分
更多实例
import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改对象a中的['a', 'b']数组对象 print( 'a = ', a ) print( 'b = ', b ) print( 'c = ', c ) print( 'd = ', d ) ''' ('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5]) ('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5]) ('c = ', [1, 2, 3, 4, ['a', 'b', 'c']]) ('d = ', [1, 2, 3, 4, ['a', 'b']]) '''
不可变对象的深浅拷贝就不重要了,因为地址本身的内容是不可变的,所以如果我们要改变变量的值,就必须改变其地址,类似于可变对象中的深拷贝
a = (1,2,3)
b = a
'''
# 值 地址
(1, 2, 3) 139964652002432
(1, 2, 3) 139964652002432
'''
a = (4,5,6)
'''
(4, 5, 6) 139964652227904 # a的地址发生改变
(1, 2, 3) 139964652002432
'''
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。