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']]

 

posted @ 2017-08-07 18:50  修仙小白  阅读(80)  评论(0编辑  收藏  举报