列表的复制

引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,所以对于它们的使用就须要当心一些。下面举个例子:app

问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制
ide

复制代码代码以下:函数


a=[1,2]
b=a
测试


这种作法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,若是对a或b的元素进行修改,a,b的值同时发生变化。spa


解决的方法为:
orm

复制代码代码以下:对象


a=[1,2]
b=a[:]
it


这样修改a对b没有影响。修改b对a没有影响。io


但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,若是列表元素还存在列表的话,这种方法就不适用了。缘由就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,若是列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。为了证实这一点,测试步骤以下:
class

复制代码代码以下:


>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]


可见,对a的修改影响到了b。若是解决这一问题,能够使用copy模块中的deepcopy函数。修改测试以下:

复制代码代码以下:


>>> import copy
>>> a=[1,[2]]
>>> b=copy.deepcopy(a)
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]


有时候知道这一点是很是重要的,由于可能你的确须要一个新的列表,而且对这个新的列表进行操做,同时不想影响原来的列表。

相关文章
相关标签/搜索