Python的学习(二十二)---Python中的对象复制

引用Python Cookbook中的话,要想成为一个好的Python程序员,必须了解修改对象和将对象赋值给变量的区别,赋值使用的是引用。类似a=[]这样的语句,是对名字a做了重新绑定,但却不会影响原先绑定到a的对象,因此,完全没有引用和拷贝的问题。只有当需要修改某些对象的时候,引用和拷贝才有可能成为问题。

在这之前有个问题需要先说明,python中的对象包含三要素:id, type, value。 其中id是用来唯一标识一个对象,type标识对象的类型,value则是表示对象的值

is用通过id来判断a对象是否就是b对象,==则是通过value来判断a对象的值是否和b对象的值相等

当给一个对象赋值(或者将其作为参数传递,或者作为结果返回)时, Python使用了一个指向原对象的引用,并不是真正的拷贝。 Python从来不为赋值操作进行“隐式”拷贝,要得到一个拷贝,必须明确地要求需要的是拷贝。

例如:

>>> a = [1, [2, 3]]

>>> b = a

>>> b.append(4)

>>> print a, b

[1, [2, 3], 4]  [1, [2, 3], 4]

>>> b is a

True

通过 = 赋值时,b的id值并没有变化,等用于a或者b只是用来指定对象的名字,无论通过那个名字修改或查看对象的内容,结果都会是一样的。这个过程并没有一个原始的,未被修改的拷贝。如果想修改一个对象,但又需要不改动原对象,必须做一个拷贝。Python标准库的copy模块提供了两个函数来制作拷贝

一种是copy.copy,用来完成一个对象的浅拷贝,虽然声称了一个新对象,但是对象内部的属性和内容(各元素)仍然引用原对象, 例如:

>>> a = [1, [2, 3]]

>>> b = copy.copy(a)

>>> b is a

False

>>> b.append(4)

[1, [2, 3]] [1, [2, 3], 4]

上例中通过浅拷贝,已经b对象的id值已经与a不同(需要注意的是,对于一些不可改变的对象,如字符串,数字,或者元祖等,深浅拷贝都不影响对象的id值),因此如果仅修改b对象本身,对对象a并没有什么影响,但两个对象中的元素对应的仍是用一个引用,一旦通过索引修改元素,则会对两个对象均产生影响,例如:

>>> a = [1, [2, 3]]

>>> b = copy.copy(a)

>>> b[1].append(4)

[1, [2, 3, 4]] [1, [2, 3, 4]]

修改对两个对象均生效了。

copy.deepcopy是完成对象的深拷贝,从原对象中真正拷贝一个新的对象,可独立修改对象内部的属性和内容, 例如:

>>> a = [1, [2, 3]]

>>> b = copy.deepcopy(a)

>>> b[1].append(4)

[1, [2, 3]] [1, [2, 3, 4]]

修改只对对象b生效,对象a没有影响

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值