python中的拷贝
2020-01-20 本文已影响0人
SephiHorse
代码段1——数组引用
a = [1,2,3]
b = a
b[0] = 2
print(a,b)
b.remove(3)
print(a,b)
结果是
[2, 2, 3] [2, 2, 3]
[2, 2] [2, 2]
这时b与a为同一个对象,任何作用在b上的操作,a也会响应改变。
代码段2——数值数组的浅拷贝
a = [1,2,3]
b = a[:]
b[0] = 2
print(a,b)
结果是[1, 2, 3] [2, 2, 3]
。这时b只是a的一个copy,修改b的值,a不变。
代码段3——对象数组的浅拷贝
class C(object):
def __init__(self,x):
self.x = x
def change(self,x):
self.x = x
a = [C(x) for x in range(3)]
b = a[:]
c = b[0]
c.change(1)
b.remove(c)
print('a:',[e.x for e in a])
print('b:',[e.x for e in b])
结果是a: [1, 1, 2] b: [1, 2]
,修改了b[0]之后把a[0]也修改了,可见b[0]与a[0]是同一个对象,但是从b数组中remove掉b[0]后,a数组没变。可见对象数组的浅拷贝,是新建了一个长度与原数组相同的数组,然后其中元素是原数组中所有对象的引用。
如果代码中改成b = a
那就与第一种情况相同,两个数组是同一个对象。
数值数组与对象数组浅拷贝间区别的本质
代码段4——数值变量的 = 拷贝
a = 1
b = a
b = 2
print(a,b)
结果是1 2
,数值类型的变量用等号拷贝会创建新的变量,所以b的变化不会影响a。
代码段4——对象的 = 拷贝
a = C(1)
b = a
b.change(2)
print(a.x,b.x)
这段代码运用了上面的C类,结果是2 2
,对象用等号拷贝并不会创建新的对象,而是创建一个对原对象的引用,所以b与a是同一个对象,要变一起变。