首页 > 其他 > 详细

深拷贝,浅拷贝

时间:2019-06-13 21:20:04      阅读:102      评论:0      收藏:0      [点我收藏+]

1.id()

查看变量地址

a = ‘asdfasdf‘
id(a)

2.‘==‘和‘is’

 ‘==’是用来判断值相等(值比较)

 ‘is’用来判断变量地址是否相等(引用比较)

 ps:Python是一个彻底的面向对象的语言,Python的变量都是以Object形式存在的。Python似乎有一个类似于Java的对象池,为了追求效率,Java会维护对象池,对整数来说,Java会将128以内(即0到127)的整数存在pool里。若用户要求创建一个128以内的Integer时,JVM不会真去创建一个新的对象, 而是直接从这个pool里将对应整数对象的引用返回。而Python也有类似的机制,但范围不是128以内了。通过测试得出Python的范围是(-5)~(256)(现在我知道了,这个东西叫小整数对象池。。。)

 3.深拷贝、浅拷贝

 1. 浅拷贝

  • 浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容
  • 一般来说,‘=’就是浅拷贝,只是创建了一个指向原来变量地址的引用

技术分享图片技术分享图片?

2. 深拷贝

  • 深拷贝是对于一个对象所有层次的拷贝(递归)

Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。

  •  python实现深拷贝的方法是copy模块中的deepcopy()方法,实质是递归拷贝所有层次。

 技术分享图片技术分享图片?

3. 拷贝的其他方式

  • 浅拷贝还可以使用copy模块的copy()方法
  • copy方法拷贝可变类型时会自动生成一个新的地址,拷贝成被拷贝对象的最外层。例如

技术分享图片技术分享图片?

  • 分片表达式可以赋值一个序列
a = "abc"
b = a[:]
技术分享图片
  • 字典的copy方法可以拷贝一个字典
d = dict(name="zhangsan", age=27)
co = d.copy()
技术分享图片
  • 有些内置函数可以生成拷贝(list)
a = list(range(10))
b = list(a)
技术分享图片
  • copy模块中的copy函数
import copy
a = (1,2,3)
b = copy.copy(a)
技术分享图片

深拷贝,浅拷贝

原文:https://www.cnblogs.com/yrzsp/p/11019416.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!