Python中的List复制

Friday, July 2, 2010

看到火哥的分享Ruby中如何复制对象 (deep
clone)
, 很不错!\~
在Python中也是一样的,所以我分享一下Python中的列表复制。 在 Python
中,一个变量保存的值除了基本类型保存的是值外,其它都是引用(指保存的值为对象的地址),因此对于它们的使用要注意。

>>> a = [0,[1,2]]
>>> b = a
>>> b[0] = 88
>>> b[1][0] = 99
>>> b
[88, [99, 2]]
>>> a
[88, [99, 2]]
>>> # 这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。
...
>>> # 好吧,用[:]试试看
...
>>> a = [0,[1,2]]
>>> b = a[:]
>>> b[0] = 88
>>> b[1][0]=99
>>> b
[88, [99, 2]]
>>> a
[0, [99, 2]]
>>> # 你懂的,这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表的话,这种方法就不适用了,原因就是,象a[:]这种处理,只是将列表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a = [0,[1,2]],那么这种复制 对于元素[]的处理只是复制[1,2]的引用,而并未生成 [1,2]的一个新的列表复制。
...
>>> # 关于deep copy, Python里面有个copy模块(http://docs.python.org/library/copy.html), 有个deepcopy方法可以解决List深度复制问题
...
>>> from copy import deepcopy
>>> a = [0,[1,2]]
>>> b = deepcopy(a)
>>> b[0] = 88
>>> b[1][0] = 99
>>> b[1].append(100)
>>> a
[0, [1, 2]]
>>> b
[88, [99, 2, 100]]
>>> # 你懂的!~

This entry was tagged Python

comments powered by Disqus

© 2009-2013 lxneng.com. All rights reserved. Powered by Pyramid

go to Top