python copy & deepcopy

摘要:
1 python中的一切事物皆为对象,并且规定参数的传递都是对象的引用。
2  python参数传递都是“传对象引用”方式。实际上相当于c++中传值和传引用的结合。
3 如果函数收到的是可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值”来传递对象。
>>> a = 1
>>> b = 1
>>> id(a)
15106392
>>> id(b)
15106392
id(a) = id(b)

>>> a = [1]
>>> b=[1]

>>> id(a)
140657598496424
>>> id(b)
140657598578128
id(a) != id(b)

>>> a= b
>>> id(a)
140657598496424
>>> id(b)
140657598578128
id(a)=id(b)

1.浅拷贝(copy()):对对象进行拷贝,并生成新的对象,但对象中的元素只会使用原始对象中的引用

>>> d=copy.copy(a)
>>> a.append(8)
>>> a,d
([1, 2, 4, 5, 6, ['a', 'b', 'c'], 7, 8], [1, 2, 4, 5, 6, ['a', 'b', 'c'], 7])
>>> a[5].append('d')
>>> a,d
([1, 2, 4, 5, 6, ['a', 'b', 'c', 'd'], 7, 8], [1, 2, 4, 5, 6, ['a', 'b', 'c', 'd'], 7])

2.深拷贝(deepcopy()):会生成一个新对象,对象中的元素也会重新生产成一份

>>> a=[1,2,[1,2]]
>>> d=copy.deepcopy(a)
>>> a.append(3)
>>> a,d
([1, 2, [1, 2], 3], [1, 2, [1, 2]])
>>> a[2].append(3)
>>> a,d
([1, 2, [1, 2, 3], 3], [1, 2, [1, 2]])

*对于非容器类型没有拷贝这一说法

*对于元组变量中只包含原子类型的元素不能进行深拷贝

 

知识补充:  

内存模型

依据变量在内存中的组织分类。Python的类型, 就象绝大多数其它语言一样,能容纳一个或多个值。一个能保存单个字面对象的类型我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储。(容器对象有时会在文档中被称为复合对象,不过这些对象并不仅仅指类型,还包括类似类实例这样的对象)

分类                Python 类型
标量/原子类型         数值(所有的数值类型),字符串(全部是文字)
容器类型             列表、元组、字典

 

转载于:https://www.cnblogs.com/ChaserChen/p/4823867.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值