python中的引用,Python里的引用和拷贝

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会对每个属性执行递归操作,以保证所有属性全部为新的对象,而不只是原

对象引用的拷贝。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值