这篇文章主要介绍了python中的拷贝问题,即不同的拷贝方式得到的新对象,对其进行修改是否影响原对象。了解这一块,首先需要了解数据类型,所以接下来从数据类型讲起。
依据对象在内存中的组织分类,可以分为以下两种类型:
一. 原子类型:只能保存单个字面对象的类型, 如数值(所有的数值类型),字符串(全部是文字)。
二. 容器类型:可容纳多个对象的类型,如 列表,元祖,字典等
对于原子类型,不存在深浅拷贝的说法,每一个不同的值代表一个新的对象。
1 >>> import copy 2 >>> d=23 3 >>> e0=d 4 >>> e1=copy.copy(d) 5 >>> e2=copy.deepcopy(d) 6 >>> e0=230 7 >>> e1=231 8 >>> e2=232 9 >>> d, e0, e1, e210 (23, 230, 231, 232)
对于容器类型,有以下两种拷贝方式: ini=[12, 'beautiful', ['we', 'are', 'a', 'team'] ]
1)常见赋值
等号赋值,等号两边指向的是同一个对象,等号左边是对象的别名,不管对别名还是自身操作修改的都是同一内存中的对象。即ini_0 是 ini.
1 >>> ini=[12, 'beautiful', ['we', 'are', 'a', 'team']] 2 >>> ini_0=ini 3 >>> ini_0[0]=120 4 >>> ini_0[1]='cute' 5 >>> ini_0[2].append('world') 6 >>> ini_0 7 [120, 'cute', ['we', 'are', 'a', 'team', 'world']] 8 >>> ini 9 [120, 'cute', ['we', 'are', 'a', 'team', 'world']]10 >>>
2)浅拷贝
浅拷贝产生一个新的对象,但对象中的子对象指向的是原对象,代码效果如下:
1 >>> ini 2 [120, 'cute', ['we', 'are', 'a', 'team', 'world']] 3 >>> ini_1=copy.copy(ini) 4 >>> ini_1[0]=121 5 >>> ini_1[1]='clever' 6 >>> ini_1[2].remove('team') 7 >>> ini_1 8 [121, 'clever', ['we', 'are', 'a', 'world']] 9 >>> ini10 [120, 'cute', ['we', 'are', 'a', 'world']]11 >>>
也就是说,ini_1 不是ini, 但ini_1[i] 是 ini[i]。
3)深拷贝
深拷贝也产生一个新的对象,并且对象中的子对象不指向原对象的子对象,代码效果如下:
1 >>> ini 2 [120, 'cute', ['we', 'are', 'a', 'world']] 3 >>> ini_2=copy.deepcopy(ini) 4 >>> ini_2[0]=122 5 >>> ini_2[1]='happy' 6 >>> ini_2[2].append('family') 7 >>> ini 8 [120, 'cute', ['we', 'are', 'a', 'world']] 9 >>> ini_210 [122, 'happy', ['we', 'are', 'a', 'world', 'family']]11 >>>
也就是说,ini_2 不是ini, 但ini_2[i] 也不是 ini[i]。