Chinaunix首页 | 论坛 | 博客
  • 博客访问: 710394
  • 博文数量: 214
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:02
文章分类

全部博文(214)

文章存档

2008年(43)

2007年(171)

我的朋友

分类:

2007-10-11 17:29:34

immutable 对象赋值时创建copy
mutable对象赋值时创建引用
有两种对mutable对象的copy操作:

  • shadow copy:原始对象里的mutable对象copy的是引用,用[:], dict.copy, copy.copy
  • deep copy:递归copy整个对象,用copy.deepcopy

>>> a=[[1,2,3], [4,5,6]]
>>> import copy
>>> b=copy.copy(a)    #浅copy
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][0]='a'       #对a进行修改
>>> a
[['a', 2, 3], [4, 5, 6]]   #a发生了变化
>>> b
[['a', 2, 3], [4, 5, 6]]   #b也发生了变化
>>> a=[[1,2,3], [4,5,6]]
>>> b=copy.deepcopy(a)    #深copy
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][0]='a'
>>> a
[['a', 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]   #b没变

浅copy会先成一个新的对象,然后把原对象的属性值添加到新的对象中。但原对象
的属性值很可能又是对象,这样,就是一种递归的概念了。象上面的测试就是列表
中的每个元素又是列表。但浅拷贝对于属性值不再判断它是否为一个特殊对象,
是把属性值的引用简单地追加到新对象中
。因此在第一个测试中,使用浅拷贝虽然
生成了一个新的对象,但它的属性(即每个子元素为列表)仍然会为原来的子元
素。这样由于子列表在新旧列表对象都是一样的,因此对原列表中子列表的改变就
影响了新列表的属性值。

深copy会对每个属性执行递归操作,以保证所有属性全部为新的对象,而不只是原
对象引用的拷贝。

这是对于象列表这种可变对象才会出现的情况,对于不可变对象则没有关系。

阅读(1025) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~