一 定义

在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}}

总结:

  1. 不论针对列表还是字典,浅拷贝时,修改的元素类型是可变类型时,他变我也变,修改的类型是不可变类型时,他变我不变。

  2. 不论针对列表还是字典,深拷贝时,他变我不变。

  3. 可变类型:字典、列表。

  4. 不可变类型:整型、字符串、元组。

Python3 深浅拷贝的更多相关文章

  1. Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数

    一.上节课的重点回顾: 1.类名加括号其实就是执行类的__init__方法: 2.int a.创建方式 n1 = 123 #根据int类创建了一个对象 n2 = int(123) #根据int类创建一 ...

  2. python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数

    上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...

  3. 学习--->更新集合/内存/深浅拷贝

     一.计算机基础 1..软件(应用程序) 2.解释器/编译器 - 解释型语言:将代码每一行传递给计算机一行,常用编程语言python,PHP,Ruby. - 编译型语言:将代码完全执行完后会形成一个文 ...

  4. Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

    一.运算符及优先级 Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 1.算数运算符 运算符 描述 实例,a=20,b=10 + 加 a+b输出结果30 - 减 a-b输出结果 ...

  5. python运算符,数据类型,数据类型操作,三目运算,深浅拷贝

    算数运算符: Py2中精确除法需要导入:from __future__ import division,(符由特  ,将来的.滴未省,除法) py3不需要导入 赋值运算符: 比较运算符: 成员运算符: ...

  6. python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)

    一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...

  7. python开发学习-day03(set集合、collection系列 、深浅拷贝、函数)

    s12-20160116-day03 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  8. python-运算、分支、深浅拷贝

      算术表达式: + - * / 除法Python3中是默认向浮点数靠拢 //取整运算   结果的最小整数靠拢  向下 5 // 2 = 2(向下取整) %取余运算 5 % 2 = 1 **幂值运算 ...

  9. 人生苦短之我用Python篇(深浅拷贝、常用模块、内置函数)

    深浅拷贝 有时候,尤其是当你在处理可变对象时,你可能想要复制一个对象,然后对其做出一些改变而不希望影响原来的对象.这就是Python的copy所发挥作用的地方. 定义了当对你的类的实例调用copy.c ...

随机推荐

  1. Jquery知识点总结(一)

    JQuery遍历1 传统的for   2 通过each对象调用callback函数 callback回调函数 /*    * JQ提供的技术,实现遍历    * JQ对象函数调用 each(参数 ca ...

  2. 前端优化:css雪碧图实践应用详解

    一 为什么需要使用雪碧图 二CSS雪碧图原理及应用 前端是接近用户体验的一个项目组成部分,合适的优化能够大大减少网页响应时间,合理的资源加载自然成为了工作中的要务,现在就结合实例讲解到底什么是css雪 ...

  3. ArrayList的源码分析(基于jdk1.8)

    1.初始化 transient Object[] elementData; //实际存储元素的数组 private static final Object[] DEFAULTCAPACITY_EMPT ...

  4. Manjaro Linux KDE个人的一些安装配置

    安装manjaro kde linux的个人步骤 1 换源 1.1 自动寻找最快的源 sudo pacman-mirrors -i -c China -m rank 1.2 修改源文件 sudo ge ...

  5. 《Mysql高级知识》系列分享专栏

    <Mysql高级知识>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201756.html 文章 MySQL数据库InnoDB引擎 ...

  6. A1092

    可输入内容为0-9,a-z,A-Z. 输入: 第一行输入任意字符串: 第二行输入期望字符串. 输出: 如果第一行包含了所有期望字符串,输出yes和多余字符个数: 如果第一行不能完全包含期望字符串,输出 ...

  7. C数列下标 牛客OI赛制测试赛2

    链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 给出一个数列 A,求出一个数列B. 其中Bi   表示 数列A中 Ai 右边第一个比 Ai 大的 ...

  8. 【Hutool】Hutool工具类之Http工具——HttpUtil

    最简单最直接的上手可以参见参考文档:http://hutool.mydoc.io/?t=216015   Http协议的介绍,请参考web随笔:http://www.cnblogs.com/jiang ...

  9. hdu 2031 进制转换(栈思想的使用)

    进制转换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. 北京Uber优步司机奖励政策(1月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...