这篇文章主要介绍了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, e2
10 (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 >>> ini
10 [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_2
10 [122, 'happy', ['we', 'are', 'a', 'world', 'family']]
11 >>>

也就是说,ini_2 不是ini, 但ini_2[i] 也不是 ini[i]。

posted on 2017-09-25 17:36  寒若雪  阅读(641)  评论(0编辑  收藏  举报