Python中的赋值,浅拷贝和深拷贝的区别
2017-05-08 19:37
288 查看
赋值
内存地址的引用,所有的改变都会同步
测试代码
#coding:utf-8
import copy
a=['a','b',1,[1,2,3]]
b = a #对象赋值,所有改动都会联动
a.append('d')
a[0]='aaa'
a[3].append(4)
print a
print b
运行结果
['aaa', 'b', 1, [1, 2, 3, 4], 'd']
['aaa', 'b', 1, [1, 2, 3, 4], 'd']
浅拷贝
str,num等深浅拷贝都一样,list、dict可变类型 浅拷贝后都用以前的内存地址
测试代码
#coding:utf-8
import copy
a=['a','b',1,[1,2,3]]
b = copy.copy(a) #浅拷贝,复制了a,b,1的地址引用,对于可变量list、dict,浅拷贝后内存引用地址不变
a.append('d') #对第一层元素新增对象,因为没有被拷贝,不会影响到b
a[0]='aaa' #字符串为不可变量,所以会生成一个新的地址引用,所以也不会影响到b
a[3].append(4) #liest和dict为可变量,对list的修改,会影响到b
print a
print b
运行结果
['aaa', 'b', 1, [1, 2, 3, 4], 'd']
['a', 'b', 1, [1, 2, 3, 4]]
一般使用list切片,set等都为浅拷贝操作
深拷贝
str,num等深浅拷贝都一样,list、dict可变类型 深拷贝后会引用新生成的内存地址
测试代码
#coding:utf-8
import copy
a=['a','b',1,[1,2,3]]
b = copy.deepcopy(a) #深拷贝,复制了a,b,1等不可变类型的地址引用,对于可变量list、dict,深拷贝后引用的是新的内存地址
a.append('d') #对第一层元素新增对象,因为没有被拷贝,不会影响到b
a[0]='aaa' #字符串为不可变量,所以会生成一个新的地址引用,所以也不会影响到b
a[3].append(4) #liest和dict为可变量,深拷贝后,b中的list为新的内存地址,所以不会影响到b
print a
print b
运行结果
['aaa', 'b', 1, [1, 2, 3, 4], 'd']
['a', 'b', 1, [1, 2, 3]]
总结
对于两个变量需要联动一致的情况,可以使用赋值操作。对于拷贝后,对于list、dict类型数据需要联动的情况,可以使用copy浅拷贝,如list数据的共享情况
对于拷贝后,对于list、dict类型数据需要进行独立的拷贝,不受影响,可以使用deepcopy深拷贝,类似获取某个时刻数据的分支副本,可使用deepcopy
相关文章推荐
- Python 赋值、浅拷贝、深拷贝的区别?
- python中赋值-浅拷贝-深拷贝的区别
- Python FAQ2:赋值、浅拷贝、深拷贝的区别?
- Python 赋值、浅拷贝、深拷贝的区别?
- Python FAQ2:赋值、浅拷贝、深拷贝的区别?
- Python 赋值、浅拷贝、深拷贝的区别?
- Python赋值、浅拷贝与深拷贝之间的区别
- Python中的赋值、浅拷贝、深拷贝的区别?
- python 赋值的时候是引用,如果需要复制则需要注意深拷贝和浅拷贝的区别
- python编程之赋值和拷贝的区别概述及操作excel数据库(图)
- 图解python中赋值、浅拷贝、深拷贝的区别
- Python 中赋值和分片拷贝的区别
- Python 赋值、浅拷贝、深拷贝的区别?
- python 赋值操作符与增强赋值操作符的区别
- python的浅拷贝和深拷贝的区别
- python赋值和拷贝----一切皆对象,参数皆引用
- Python——赋值、浅拷贝、深拷贝
- C++中拷贝构造、赋值构造的区别
- python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域
- python赋值和深浅拷贝