python笔记2 - 深浅拷贝
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋值给另一个变量时,python并没有拷贝这个对象,而是拷贝了这个对象的引用。
赋值:
赋值只是传递对象引用,引用对象id是一样的,原始列表改变,被赋值的b也会做相同改变。
a = [1, 2, 3, ['a', 'b']] #把a的值赋给b,其实是把a的对象引用赋给b b = a # a和b的内存地址一样,输出:7190856 [1, 2, 3, ['a', 'b']] print(id(a)) print(id(b), b) #改变a的值,在最末尾添加5 a.append(5) #a和b的值都随之更改,但内存不变,输出:7190856 [1, 2, 3, ['a', 'b'], 5] print(id(a), a) print(id(b), b)
浅拷贝
浅拷贝是指拷贝的只是原始对象元素的引用。换句话说,浅拷贝产生的对象本身是新的。但是它的内容不是新的,只是对原对象的一个引用。
import copy a = [1, 2, 3, ['a', 'b']] #浅拷贝,只是拷贝了a的引用对象,c是内存中新开辟了一个对象 c = copy.copy(a) print(id(a), a) #输出:18618312 [1, 2, 3, ['a', 'b']] print(id(c), c) #输出:18252616 [1, 2, 3, ['a', 'b']] #更改a的值,在列表元素的最后添加一个值,但a更改的是列表内的数字,c的值不变(数字不可变) a.append(5) print(id(a), a) #输出:18618312 [1, 2, 3, ['a', 'b'], 5] print(id(c), c) #输出:18252616 [1, 2, 3, ['a', 'b']] #更改a列表中的数据,将a更改为new,c的值也随之改变(列表是可变的) a[3][0] = 'new' print(id(a), a) #输出:18749384 [1, 2, 3, ['new', 'b'], 5] print(id(c), c) #输出:12133192 [1, 2, 3, ['new', 'b']]
深拷贝
深拷贝是指完全拷贝原始对象,而且产生的对象是新的,并且不受其他引用对象的操作影响。
import copy a = [1, 2, 3, ['a', 'b']] #深拷贝a的值,拷贝的内容一样、数字的内存地址一样、引用列表的内存地址不一样 d = copy.deepcopy(a) print(id(a), a) #输出:18814920 [1, 2, 3, ['a', 'b']] print(id(d), d) #输出:18815432 [1, 2, 3, ['a', 'b']] #更改a的值,更改列表内的数据,d不随之改变 a.append(5) print(id(a), a) #输出:18819016 [1, 2, 3, ['a', 'b'], 5] print(id(d), d) #输出:18819528 [1, 2, 3, ['a', 'b']] #更改a列表中的元素,b也不随之改变 a[3][0] = 'new' print(id(a), a) #输出:18552776 [1, 2, 3, ['new', 'b'], 5] print(id(d), d) #输出:18553288 [1, 2, 3, ['a', 'b']]