Python高级编程-深拷贝与浅拷贝

来源:互联网 发布:淘宝网服务中心 编辑:程序博客网 时间:2024/06/05 16:19

1. ==,is的使用

这里写图片描述

这里写图片描述
总结:
 • is 是比较两个引用是否指向了同一个对象(引用比较)。
 • == 是比较两个对象是否相等。

2. 浅拷贝、深拷贝

python中的深拷贝和浅拷贝和java里面的概念是一样的,所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝。
首先,对赋值操作我们要有以下认识:
 1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。
 2.修改不可变对象(str、tuple)需要开辟新的空间
 3.修改可变对象(list等)不需要开辟新的空间

2.1浅拷贝

浅拷贝是对于一个对象的顶层拷贝,仅仅复制了容器中元素的地址
通俗的理解是:拷贝了引用,并没有拷贝内容
这里写图片描述
这里写图片描述
总结:
 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。

2.2 深拷贝

深拷贝是对于一个对象所有层次的拷贝(递归),完全拷贝了一个副本,容器内部元素地址都不一样
这里写图片描述

这里写图片描述
总结:
 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。
 

2.3 拷贝的其他方式

浅拷贝对不可变类型和可变类型的copy不同
●对于列表[]来说:

import copya = [11,22,33]b = copy.copy(a)print(b)print(id(a),id(b))a.append(44)print(a)print(b)

运行结果:
这里写图片描述

●对于元组()来说:

import copya = (11,22,33)b = copy.copy(a)print(b)print(id(a),id(b))

运行结果:
这里写图片描述

对字典{}来说:

a=dict(name="zhangsan",age=27)b=a.copy()print(b)print(id(a),id(b))

运行结果:
这里写图片描述

• 分片表达式可以赋值一个序列

a='abc'b=a[:]print(b)#b='abc'

• 有些内置函数可以生成拷贝(list)

a = list(range(10))b = list(a)print(a)print(b)print(id(a),id(b))

运行结果:
这里写图片描述

原创粉丝点击