本文来和大家来理解一下python中的赋值、深拷贝与浅拷贝。
首先先来看几个概念:
1.变量:自己定义的名字,可以关联到对象的内存空间
2.引用:变量到对象的关联
3.对象:内存空间的一块区域,用来存储数据
4.不可变对象:一旦创建就不能改变的对象,比如字符串,tuple,数值类型
5.可变对象:可以改变的对象,比如列表,字典,集合
1
赋值
在python中,对象赋值实际上就是传递引用。当创建一个对象,赋值给另外一个变量时,python并不会拷贝这个对象,而是拷贝这个对象的引用。
举个例子:
a = 'wangzai'
这个赋值语句,其实可以分为3个部分。
创建变量a
创建一个对象分配内存空间,存储wangzai这个字符串
变量a引用到这个内存空间
b = 'wangzai'
拷贝了a的引用,不会单独开辟新的内存空间变量b通过这个引用关联到对象
2
浅拷贝
浅拷贝:只拷贝了一层,拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。
三种形式:切片操作,list函数和copy模块中的copy函数
import copyl1 = [1,[2,3],4]# 切片l2 = l[:]# list函数l3 = list(l)# copy函数l4 = copy.copy(l)# 当我们去修改内部元素时l2[1][1] = 4print(l1) # [1, [2, 4], 4] 原来的对象受到了影响print(l2) # [1, [2, 4], 4]
3
深拷贝
深拷贝:拷贝了对象的所有元素,包括内嵌的元素。不再和原对象有任何关联。
from copy import deepcopylist1 = [1,['a'],2]list2 = deepcopy(list1)list2[1][0] = 'b'print(list1) #[1, ['a'], 2]print(list2) #[1, ['b'], 2] 就算修改内嵌列表中的元素,也不会影响原对象