邓莫尔的维基世界

个人日志便签博客 By dume2007@gmail.com

首页 PHP Linux Python 日记 View on GitHub

Python变量的赋值与拷贝

之前要对一个list对象进行操作,为了保留原始对象值,所以进行了简单赋值,打印出来发现两个变量同时变了~

>>> lst = [1,2,3]
>>> lst
[1, 2, 3]
>>> org_lst = lst
>>> org_lst
[1, 2, 3]
>>> lst.pop()
3
>>> lst
[1, 2]
>>> org_lst
[1, 2]
>>>

显然要复制一个可变对象的副本,简单的赋值是行不通的。这跟PHP还是有区别的,不小心踩了一个坑~ 经过查找资料,发现Python提供了一个copy模块,是专门用于可变对象的复制的。 copy中有两个方法:浅拷贝copy.copy() 和 深拷贝copy.deepcopy(),下面举个例子:

>>> import copy
>>> lst
[1, 2, 3]
>>> org_lst = copy.copy(lst)
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
>>> org_lst
[1, 2, 3]

以上是浅拷贝,通过copy副本就不随原对象改变了,如果要拷贝深度对象,就需要用到深拷贝deepcopy(),看个例子:

>>> a = [[1,2], [3,4]]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> print a,b,c
[[1, 2], [3, 4]] [[1, 2], [3, 4]] [[1, 2], [3, 4]]
>>> a[0][1] = 5
>>> print a,b,c
[[1, 5], [3, 4]] [[1, 5], [3, 4]] [[1, 2], [3, 4]]

以上对比可以发现,当a的内部对象变更之后,通过copy()浅拷贝内部对象也跟着变了,而通过deepcopy()则是保持原始值。