我们在写程序是免不了要用到复制,python是一门动态编程语言,python中的变量是一个引用,因此我们用一个变量给另一个变量赋值时,往往会发生意想不到的错误!我在以前用list.append()函数给列表添加元素时,发生了一个奇怪的问题,后面添加的元素会把前面的元素覆盖掉!这里就要用到copy模块了!
博客转自:http://blog.csdn.net/wyabc1986/article/details/7731395
copy模块包括创建复合对象(包括列表、元组、字典和用户定义对象的实例)的深浅复制的函数。
########
copy(x)
########
创建新的复合对象并通过引用复制x的成员来创建x的浅复制。更加深层次说,
它复制了对象,但对于对象中的元素,依然使用引用。
对于内置类型,此函数并不经常使用。
而是使用诸如list(x), dict(x), set(x)等调用方式来创建x的浅复制,要知道像这样
直接使用类型名显然比使用copy()快很多。但是它们达到的效果是一样的。
还有一点就是对于那些不可修改的对象(string, 数字, 元组),因为你不用担心修改他们。复制不复制也就没有
什么大的意义了。
另外一点,你判断对象之间是否是拷贝,可以使用is运算符来确定。
a is b -> True a与b引用的是同一个对象,不是拷贝
-> False a与b是彼此拷贝对象
例如下面的例子,eg:
(1)
>>> a = [1,2,3] >>> b = copy.copy(a) >>> b [1, 2, 3] >>> a.append(4) >>> a [1, 2, 3, 4] >>> b [1, 2, 3] >>> a is b False(2)
>>> a = [1,2,3] >>> b = a >>> b [1, 2, 3] >>> a.append(4) >>> a [1, 2, 3, 4] >>> b [1, 2, 3, 4] >>> b.append(6) >>> a, b ([1, 2, 3, 4, 6], [1, 2, 3, 4, 6])(3)
>>> a = [1,2,3] >>> b = list(a) >>> b [1, 2, 3] >>> a.append(4) >>> a [1, 2, 3, 4] >>> b [1, 2, 3] >>>(4)
>>> a = [[1], ['a'], ['A']] >>> b = copy.copy(a) >>> print a, b [[1], ['a'], ['A']] [[1], ['a'], ['A']] >>> b[1].append('b') >>> b [[1], ['a', 'b'], ['A']] >>> a [[1], ['a', 'b'], ['A']] >>> b.append([100,101]) >>> b [[1], ['a', 'b'], ['A'], [100, 101]] >>> a [[1], ['a', 'b'], ['A']]在(3)例子当中,我们可以看到a的浅复制对象b,它们是不同的对象,所以对对象的改变是不会
>>> a = [[1], ['a'], ['A']] >>> import copy >>> b = copy.deepcopy(a) >>> b [[1], ['a'], ['A']] >>> c = copy.copy(a) >>> c [[1], ['a'], ['A']] >>> a[1].append('b') >>> a [[1], ['a', 'b'], ['A']] >>> b [[1], ['a'], ['A']] >>> c [[1], ['a', 'b'], ['A']]需要注意的是: