说明
-
直接赋值:
- python直接赋值其实就是对象的引用(别名)。
- 即:对象的赋值都是进行对象引用(内存地址)传递
- 二者指向同一对象。
-
浅拷贝:
- 拷贝父对象,不会拷贝对象内部的子对象。
- 即:浅拷贝会创建一个新的对象,但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)
- 产生浅拷贝的效果:
- 使用切片[:]操作
- 使用工厂函数(如list/dir/set)
- 使用copy模块中的copy()函数
- 二者是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
-
深拷贝:
- copy的deepcopy方法,完全拷贝了父对象及子对象。
- 二者是完全独立的对象。
-
拷贝的特殊情况:
- 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有拷贝这一说。
- 如果元祖变量只包含原子类型对象,则不能深拷贝。
案例
代码:
#!/usr/bin/python
# -*-coding:utf-8 -*-
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']]) # 深拷贝,二者完全独立