一 定义

在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. Appstore|IPA

    ios提审报错:No suitable application records were found. Verify your bundle identifier 'xx' is correct - ...

  2. python打印99乘法表

    代码如下: print(XXX,end="\t") #表示打印不换行 附带python部分转义字符:

  3. HTML5开篇定义(更新中)

    以下介绍的两种属性是为后面的属性支持左铺垫,大概一看就OK了. 通用属性 id 用于为HTML元素指定唯一标识 style 用于为HTML元素指定CSS指定样式 class 用于匹配CSS样式的cla ...

  4. ORALCE表的约束条件

    一.主键:(PRIMARY KEY) 主键是表中的一列或多列.为表定义主键有如下几个作用: 1.主键包含的列不能输入重复的值,以此来保证一个表的所有行的唯一性: 2.主键也不允许定义此约束的列为NUL ...

  5. 第8天 Java基础语法

    第8天 Java基础语法 今日内容介绍 Eclipse开发工具 超市库存管理系统 Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动编译,检 ...

  6. ajax重定向登录页

    /** * ajax默认设置 * 包括默认提交方式为POST, * 判断后台是否是重定向 */ $.ajaxSetup( { //设置ajax请求结束后的执行动作 complete : functio ...

  7. 使用Goland同步远程代码

    新版本的goland貌似已经有了Deployment功能,故本篇文章描述的方法也不推荐使用了 以前写php时候习惯使用phpstorm这个编译器,除去本身功能强大不说,比较方便的是其自身带的Deplo ...

  8. 教你阅读MSDN英文文档,迅速提升编程能力

    在教大家阅读英文文档之前,首先给大家明确一个概念.C#和.NET的区别? 有一定编程经验的同学应该多多少少知道这方面的概念,但是可能模糊,理解的不一定深刻.我在这里简单给出两者的基本定义: C#:仅仅 ...

  9. 【EXCEL】XMLファイルを開く方法(XML文件打开方法)

    前言 XMLとは:Extensible Markup Language(エクステンシブル マークアップ ランゲージ)は.基本的な構文規則を共通とすることで.任意の用途向けの言語に拡張することを容易とし ...

  10. postgresql 日期类型处理实践

    ---- 日期+1 select date '2018-01-14' + integer '1'; 结果: 2018-01-15 ---- 日期+1 后 转 20180101 日期字符串 select ...