Python中的赋值以及深复制和浅复制(深拷贝和浅拷贝)

来源:互联网 发布:welsh算法 编辑:程序博客网 时间:2024/05/18 17:55

首先看赋值

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

在Python中,变量可看做是指向内存的指针,执行a = [1, 2, 3]后,a指向这个列表,执行b = a后,b也指向这个列表(或理解为b指向a指向的列表),两个变量指向同一块内存,因此对b的操作也会影响a。

再举一例:

>>> a = 1>>> b = a>>> a = 2>>> print a,b 2 1

然后看浅复制:

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

此时原列表a不受影响,再接着看:

>>>b[2].append(5) >>>print b[1,2,[3,4,5],5]>>>print a[1,2,[3,4,5]]

可以看到a和b都改变了,也就是说copy()方法返回列表的浅复制是生成一个新列表,并且把原列表中的引用也复制到新列表中。整数,实数等基本类型以及元组字符串这样的不可变类型不受此影响,但如本例中的列表内的子列表,属于可变数据类型,修改它便会影响原列表。

最后看深复制

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

深复制会对原列表中的元素进行递归,会把嵌套的子列表的值也复制过来,而不是只复制引用,虽然多花费了一些时间和空间,但是新列表和原列表是互相独立的,互不影响。


0 0