您的位置:首页 > 编程语言 > Python开发

python引用、浅拷贝与深拷贝的实现

2017-03-26 22:35 99 查看
python不允许选择传值还是传引用,python参数的传递采用传对象引用。如果子函数收到的是一个可变对象(比如字典或者列表)的引用,则修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值’来传递对象。

- python的引用

- python的浅拷贝

浅拷贝指的是对可变对象如字典和列表的复制,但字典和列表的内容只可是不可变对象,不能是可变对象。即列表或元祖中不能存在列表和元祖,否则就不能实现列表中的列表的独立复制。

>>> import copy   #导入copy模块
>>>
>>> alist=[1,2,3]
>>> blist=copy.copy(alist)
>>> alist=[4,5,6]
>>> print alist
[4, 5, 6]
>>> print blist
[1, 2,3]


#修改列表中列表的值,两者都会被修改
>>> import copy
>>> alist=[1,2,3,[100,200,300]]
>>> blist=copy.copy(alist)
>>> alist[3][0]=1000
>>> print alist
[1, 2, 3, [1000, 200, 300]]
>>> print blist
[1, 2, 3, [1000, 200, 300]]
#添加列表中列表的值,并非修改,所以两者没有相互影响
>>> alist.append(4)
>>> print alist
[1, 2, 3, [1000, 200, 300], 4]
>>> print blist
[1, 2, 3, [1000, 200, 300]]
#修改列表中列表的值,两者都会被修改
>>> alist[3][1]=2000
>>> print alist
[1, 2, 3, [1000, 2000, 300], 4]
>>> print blist
[1, 2, 3, [1000, 2000, 300]]


python的深拷贝

由上面可知,python的引用和浅拷贝均不能实现完全独立的拷贝,总是存在数据内存共享或部分共享;python里的深拷贝可实现完全独立的内存拷贝,分别对两者的数据操作互不影响。

>>> import copy
>>> alist=[[1,2,3],[4,5,6],[7,8,9]]
>>> blist=copy.deepcopy(alist)
>>> alist[0][0]=100
>>> alist[0][1]=200
>>> alist[0][2]=300
>>> print alist
[[100, 200, 300], [4, 5, 6], [7, 8, 9]]
>>> print blist
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python