Python中的深浅拷贝

一、可变数据类型和不可变数据类型

1、不可变数据类型:字符串、数值、元祖

所有值相同的不可变数据类型都指向同一个内存空间,当对某个不可变数据类型赋值的时候,实际上是指向了另一块内存空间。

a = 1
b = a
print(a)  #1
print(b)  #1
#a和b的值相同,指向同一块内存空间

a = 2
print(a)  #2
print(b)  #1
#a和b的值不同,指向不同的内存空间,b没变,只是a指向了另一个空间

2、可变数据类型:列表、字典、集合

对于可变数据类型的操作不会改变其指向的内存地址,但是直接赋值还是会改变。

l1 = [111,222]
l2 = l1
#l1和l2都是[111,222]

l1.append(333)
#l1和l2都变成[111,222,333]

l1 = [111]
#l1变了,l2不变

 

二、赋值和深浅拷贝

1、=赋值

在python中,=赋值的双方完全共享同一块内存空间,如果是可变数据类型,那么一方的改动会影响另一方。

2、浅拷贝

浅拷贝开辟一块新的内存空间,保存同样的数据内容,一方在第一层的改动不会影响另一方,但是在第二层及以下的改动仍然会影响。举例,[111,222,[1,2,3]],这样一个列表,如果浅拷贝后对这个列表里的列表进行改动,仍然会影响另一方。

因为浅拷贝对于子对象只是复制了其指向的内存地址,所以仍然会影响源数据。

浅拷贝通过copy.copy()使用

3、深拷贝

深拷贝不仅开辟一块新的内存空间,复制同样的内容,且对子对象也复制一份,开辟一块内存空间,这样双方指向的都是完全不同的地址,任何改动都不影响双方。

深拷贝通过copy.deepcopy()使用

posted @ 2019-06-01 14:56  不可思议的猪  阅读(228)  评论(0编辑  收藏  举报