对象赋值实际上是简单的对象引用。也就是说创建一个对象然后赋值给另一个变量的时候,python并没有拷贝这个对象,而是拷贝了这个对象的引用。
浅拷贝:浅拷贝的是对象本身,但是内容是原来对象的引用。(拷贝对象本身是新的但是内容不是新的)。
拷贝对象的方式:
- 切片操作法
- 工厂方法(利用工厂函数)
- 使用copy模块的copy函数
来看代码:
import copy
a = ['a','b','c',[1,2,3]]
b = a
c = a.copy()
a.append('d')
a[3].append(4)
print(id(a),id(b),id(c))
print(a,b,c)
"""输出结果为"""
"""a,b的id相同,c与a,b的id不同"""
### a = ['a','b','c',[1,2,3,4],'d']
### b = ['a','b','c',[1,2,3,4],'d']
"""浅拷贝只会拷贝第一层而不会拷贝内容的第二层"""
### c = ['a','b','c',[1,2,3,4]]
"""浅拷贝后,改变原始对象中不可变类型元素的值,不会影响拷贝对象"""
a[1] = 't'
print(a,b,c)
### a = ['a','t','c',[1,2,3,4],'d']
### b = ['a','t','c',[1,2,3,4],'d']
### c = ['a','b','c',[1,2,3,4]]
深拷贝:复制的不仅是对象本身而且还有引用(创建一个新的容器对象,包含原有对象元素)
深拷贝的方式:
- 需要用到copy中的copy.deepcopy()函数。
import copy
a = ['a','b','c',[1,2,3]]
b = copy.deepcopy(a)
a.append('d')
a[3].append(4)
print(id(a),id(b))
print(a,b)
"""a,b的id值不相同"""
# a = ['a','b','c',[1,2,3,4],'d']
# b = ['a','b','c']
深浅拷贝的作用:
减少内存的使用
数据修改时对原数据进行备份以防数据丢失
对于不可变对象的深浅的拷贝(字符串,元组,数字)
不可变对象类型,没有被拷贝的说法,即使用深拷贝也是拷贝了他的引用。
对于不可变对象无论是浅拷贝还是深拷贝地址都和拷贝之前的一样。
对于可变对象的深浅拷贝
“=”引用 值与地址都相等
copy浅拷贝 值相等地址不相等
deepcopy深拷贝 值相等地址不相等
核心模块copy:
深拷贝和浅拷贝都可以在copy模块中找到。其实copy模块中就有两个函数可用:copy()进行浅拷贝操作,而deepcopy()进行深拷贝操作。