python直接赋值、浅拷贝、深拷贝的区别

一:直接赋值

赋值,就是对象的引用,给对象起别名。

i = 8
j = i
print("值是:",i, "地址:",id(i))
print("值是:",j, "地址:",id(j))

输出如下:

值是: 8 地址: 1639640400
值是: 8 地址: 1639640400

 

i 是一个int类型的对象,j 是指向 i 变量对应的对象,其实是内存地址。可以看到,j和i的值和地址都是一样的,

 

b = a: 赋值引用,a 和 b 都指向同一个对象。

 

 

 

二:浅拷贝

拷贝父对象,不会拷贝对象的内部的子对象。

a = [1,2,[3,4,5,6]]
b = a.copy()

print(a, "\t", id(a), id(a[2]))
print(b, "\t", id(b), id(b[2]))

a[2].append("abc")
print(a)
print(b)

 

输出如下:可以看到,a和b的内存地址不一样,但a[2]和b[2]的内存地址是一样的,说明指向的是同意个对象,对父对象进行操作,会印象拷贝对象。

[1, 2, [3, 4, 5, 6]]      2091843623432 2091843623368
[1, 2, [3, 4, 5, 6]]      2091843623752 2091843623368
[1, 2, [3, 4, 5, 6, 'abc']]
[1, 2, [3, 4, 5, 6, 'abc']]

 

 

b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

 

 

三:深拷贝

copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

import copy
a = [1,2,[3,4,5,6]]
b = copy.deepcopy(a)

print(a, "\t", id(a), id(a[2]))
print(b, "\t", id(b), id(b[2]))

a[2].append("abc")
print(a)
print(b)

 

输出如下:可以看到,这一次a和b的内存地址也不一样了,且对父对象进行操作,不会印象拷贝对象。

[1, 2, [3, 4, 5, 6]]      2143840475656 2143840475592
[1, 2, [3, 4, 5, 6]]      2143840475976 2143840475912
[1, 2, [3, 4, 5, 6, 'abc']]
[1, 2, [3, 4, 5, 6]]

 

 

b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

参考文章:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

***************不积跬步无以至千里***************

posted @ 2019-11-03 21:29  梁十安  阅读(553)  评论(0编辑  收藏  举报