Python3 深浅拷贝
一 定义
在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
- 浅拷贝: 浅拷贝值只拷贝一层,具有自己单独的内存地址,二层或其他层不拷贝,指向原有的内存地址。
- 深拷贝: 就是克隆一份,具有自己单独的内存地址,两者完全不相干设。
二 术语
1,变量:是一个系统表的元素,拥有指向对象的连接空间。
2,对象:被分配的一块内存,存储其所代表的值。
3,引用:是自动形成的从变量到对象的指针。
4,注意:类型(int类型,long类型(python3已去除long类型,只剩下int类型的数据))属于对象,不是变量。
5,不可变对象:一旦创建就不可修改的对象,包括字符串、元组、数字。
6,可变对象:可以修改的对象,包括列表、字典。
三 应用范围
1,切片可以应用于:列表、元组、字符串,但不能应用于字典。
2,深浅拷贝,既可应用序列(列表、元组、字符串),也可应用字典。
四 作用
1,减少内存的使用。
2,以后在做数据的清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。
五 应用
list类型
# 浅拷贝 '''
浅拷贝方法:
1、a = b[:]
2、a = b.copy()
3、引用copy模块,import cope | a = copy.copy(b)
''' wife = ['diaoqian',1988,['slaras',10000]]
hasband = wife[:] print(wife,hasband) # ['diaoqian', 1988, ['slaras', 10000]] ['diaoqian', 1988, ['slaras', 10000]] hasband[0] = 'zhaoyun'
hasband[2][1] = 2000 print(hasband)
# ['zhaoyun', 1988, ['slaras', 2000]]
print(wife)
# ['diaoqian', 1988, ['slaras', 2000]] '''
浅拷贝原则:
1、只复制一层,他变我不变,其余层,他变我也变。
2、如果只有一层,就相当于深复制了
''' # 深拷贝 '''
深拷贝方法:
1、引用copy模块,import cope | a = copy.deepcopy(b)
''' import copy wife = ['diaoqian',1988,['slaras',10000]]
hasband = copy.deepcopy(wife) print(wife,hasband)
# ['diaoqian', 1988, ['slaras', 10000]] ['diaoqian', 1988, ['slaras', 10000]] hasband[0] = 'zhaoyun'
hasband[2][1] = 8000 print(hasband)
# ['zhaoyun', 1988, ['slaras', 8000]]
print(wife)
# ['diaoqian', 1988, ['slaras', 10000]] '''
深拷贝小结:
1、深度拷贝就是克隆一份,具有自己单独的内存地址,两者完全不相干设,他变我不变。
'''
dict类型
# 浅拷贝
import copy
wife = {'name':{'diaoq':30},'slaras':10000}
hasband = copy.copy(wife)
print(hasband,wife)
# {'name': {'diaoq': 30}, 'slaras': 10000} {'name': {'diaoq': 30}, 'slaras': 10000}
hasband['name']['diaoq']= 32
hasband['slaras'] = 12000
print(hasband)
# {'slaras': 12000, 'name': {'diaoq': 32}}
print(wife)
# {'slaras': 10000, 'name': {'diaoq': 32}}
# 深拷贝
import copy
wife = {'slaras': 10000, 'name': {'diaoq': 30}}
hasband = copy.deepcopy(wife)
print(hasband,wife)
# {'name': {'diaoq': 30}, 'slaras': 10000} {'name': {'diaoq': 30}, 'slaras': 10000}
hasband['name']['diaoq'] = 32
hasband['slaras'] = 12000
print(hasband)
# {'slaras': 12000, 'name': {'diaoq': 32}}
print(wife)
# {'slaras': 10000, 'name': {'diaoq': 30}}
总结:
不论针对列表还是字典,浅拷贝时,修改的元素类型是可变类型时,他变我也变,修改的类型是不可变类型时,他变我不变。
不论针对列表还是字典,深拷贝时,他变我不变。
可变类型:字典、列表。
不可变类型:整型、字符串、元组。
Python3 深浅拷贝的更多相关文章
- Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数
一.上节课的重点回顾: 1.类名加括号其实就是执行类的__init__方法: 2.int a.创建方式 n1 = 123 #根据int类创建了一个对象 n2 = int(123) #根据int类创建一 ...
- python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数
上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...
- 学习--->更新集合/内存/深浅拷贝
一.计算机基础 1..软件(应用程序) 2.解释器/编译器 - 解释型语言:将代码每一行传递给计算机一行,常用编程语言python,PHP,Ruby. - 编译型语言:将代码完全执行完后会形成一个文 ...
- Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝
一.运算符及优先级 Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 1.算数运算符 运算符 描述 实例,a=20,b=10 + 加 a+b输出结果30 - 减 a-b输出结果 ...
- python运算符,数据类型,数据类型操作,三目运算,深浅拷贝
算数运算符: Py2中精确除法需要导入:from __future__ import division,(符由特 ,将来的.滴未省,除法) py3不需要导入 赋值运算符: 比较运算符: 成员运算符: ...
- python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)
一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...
- python开发学习-day03(set集合、collection系列 、深浅拷贝、函数)
s12-20160116-day03 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- python-运算、分支、深浅拷贝
算术表达式: + - * / 除法Python3中是默认向浮点数靠拢 //取整运算 结果的最小整数靠拢 向下 5 // 2 = 2(向下取整) %取余运算 5 % 2 = 1 **幂值运算 ...
- 人生苦短之我用Python篇(深浅拷贝、常用模块、内置函数)
深浅拷贝 有时候,尤其是当你在处理可变对象时,你可能想要复制一个对象,然后对其做出一些改变而不希望影响原来的对象.这就是Python的copy所发挥作用的地方. 定义了当对你的类的实例调用copy.c ...
随机推荐
- 持续集成(CI – Continuous Integration)
持续集成(CI – Continuous Integration) 在传统的软件开发中,整合过程通常在每个人完成工作之后.在项目结束阶段进行.整合过程通常需要数周乃至数月的时间,可能会非常痛苦.持续集 ...
- sublime text3配置python开发环境(windows版)
安装阶段: sublime text3的安装: 下载网址:https://www.sublimetext.com/ 下载完成后 ,点击安装即可. 安装Package Control: 点击 Tools ...
- 【读书笔记 - Effective Java】04. 通过私有构造器强化不可实例化的能力
工具类(utility class)不希望被实例化,比如只包含静态方法和静态域的类.为了这个目的,需要让这个类包含一个私有构造器. // 私有构造器示例 public class UtilityCla ...
- Java中枚举的相关应用
package example6; import org.junit.Test;/*1.什么是枚举? * 需要在颐堤港范围内取值,这个值只能是这个范围内的一个 * 使用枚举关键字enum * 枚举里也 ...
- JavaScript - 异步的前世今生
在开始接触JavaScript的时候,书上有一句话我记忆深刻,JavaScript是一门单线程语言,不管从什么途径去获取这个消息,前端开发者都会记住,哦~~,JavaScript是一门单线程语言, ...
- Git命令中日常不注意又很重要的坑
引言 简单聊一下Git的常用命令和概念,其中很多命令开发者在使用时用法不当导致出现很多问题: 比如,新创建的分支没有追踪想要追踪的分支,很想看到版本提交的内容 以下是觉得比较好用并且完整的 ...
- day 15 装饰器
装饰器(重点,难点) 开闭原则: 对功能的扩展开放 对代码的修改是封闭的 在目标函数前和后插入一段新的代码.不改变原来的代码 通用装饰器写法: # 存在的 ...
- QP总体结构
QP是一个基于事件驱动的嵌入式系统软件框架,其总体结构如下图. AO活动对象由事件队列和层次状态机两部分组成,每个AO占有一个优先级: QF量子框架由五个数据结构及操作组成,其数据结构采用了uCOS- ...
- 四、分离分层的 platform驱动
学习目标: 学习实现platform机制的分层分离,并基于platform机制,编写led设备和驱动程序: 一.分离分层 输入子系统.usb设备比驱动以及platform类型的驱动等都体现出分离分层机 ...
- 基于原生JS封装数组原型上的sort方法
基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...