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

时间:2022-05-08 19:51:12

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]]
>>>