复制需要区分,,复制的是源文件的数据,还是指向源文件数据的地址

1.引用   b=a时,理解为b指向了a指向的数据,相当于引用复制

a=[1,2]
b=a
#验证复制的是数据还是地址
#1.查看ab的地址
id(a) #2677646858824
id(b) #2677646858824
#2. a增加1个元素,查看b是否增加
a.append(3)
a #[1,2,3]
b #[1,2,3]

 2. 浅拷贝--copy.copy()

import copy
a=[1,2]
b=[3,4]
c=[a,b]
d=copy.copy(c) #验证问题1:d是否执行c地址
#验证方法1
id(d) #2677647114120
id(c) #2677644514824
#验证方法2
c.append(6)
c #[[1, 2], [3, 4], 6]
d #[[1, 2], [3, 4]]
结论:d没有指向c的地址 验证问题2:d执行a,b的地址,还是只是复制了a,b的值
#验证方法1
id(d[0]) #2677647113672
id(c[0]) #2677647113672
#验证方法2
a.append(5)
c #[[1, 2, 5], [3, 4]]
d #[[1, 2, 5], [3, 4]]
结论:,d中的a与c中的a,地址相同,说明d中的a,与c中的a均指向a的地址的

  浅拷贝仅仅把最外面1层进行了copy,并没有把里面多层嵌套进行递归拷贝,里面的还是指向原来的地址

3.深拷贝 copy.deepcopy()

import copy
a=[1,2]
b=[3,4]
c=[a,b]
d=copy.deepcopy(c) #验证问题1:d是否执行c地址
#验证方法1
id(d) #2677647114120
id(c) #2677644514824
#验证方法2
c.append(6)
c #[[1, 2], [3, 4], 6]
d #[[1, 2], [3, 4]]
结论:d没有指向c的地址 验证问题2:d执行a,b的地址,还是只是复制了a,b的值
#验证方法1
id(c[0]) #2677647113672
id(d[0]) #2677645539912
#验证方法2
a.append(5)
c #[[1, 2, 5], [3, 4]]
d #[[1, 2], [3, 4]]
结论:,d中的a与c中的a,地址不同,说明d中的a是复制了a的值,并没有指向a的地址

  深拷贝递归拷贝, 多层时,每层都拷贝对象的值

4.深拷贝和浅拷贝的应用

a=[1,2]
def aa(num):
num.append(3) a #[1, 2]
aa(a)
a #[1, 2, 3] #结论:函数传递的实参,一定传递的是引用地址,所以函数会改变原数据 #如果想不改变源数据需要复制,最好用深复制
aa(copy.deepcopy(a))
a #[1, 2]

5.注意事项

a=(1,2)
b=[1,2]
a1=copy.copy(a)
b1=copy.copy(b)
id(a) #
id(a1) #
id(b) #
id(b1) #
#结论:元组即使是1层,copy不拷贝,相当实用"=" #验证:元组中嵌套列表是都拷贝
a=[1,2]
b=(3,4,a)
b1=copy.copy(b)
id(b) #
id(b1) #
#结论是不拷贝

列表是可变的,,所以可以copy,元祖是不可变的,copy后改变不了,所以copy前后的2个set均不能被修改,但占用了2个空间,,没有意义但是浪费空间,所以不能copy

a=(1,2)
a1=copy.deepcopy(a)
id(a) #2677645531976
id(a1) #2677645531976 a=[1,2]
b=(3,4,a)
b1=copy.deepcopy(b)
id(b) #2677645547848
id(b1) #2677645507896

 结论:如果copy的是对象多层嵌套中的对象都不可变,则深拷贝和浅拷贝都失效,仅仅指向引用,如果最外层不可变,内层嵌套中包含可变对象,浅拷贝不拷贝,指向引用,深拷贝进行copy 

总结论:

浅拷贝

如果最外层是list可变的,浅拷贝只拷贝最外层,内部的指向引用,如果最外层是set不可变的,不论里面嵌套的可不可变,浅拷贝都不进行copy,只是指向引用

深拷贝

如果最外层是list可变的,深拷贝递归拷贝,如果最外层是set不可变的,里面嵌套的包含可变的,深拷贝进行copy,如果里面嵌套的也无可变的,深copy也不copy

其他

如果使用列表的切片,相当于copy.copy() 浅拷贝

如果使用字典中的copy()方法,相当于copy.copy() 浅拷贝

python进阶----深拷贝&浅拷贝的更多相关文章

  1. python 进阶篇 浅拷贝与深拷贝

    阐述引用.浅拷贝和深拷贝前,首先需要要了解 Python 的世界里,一切皆对象,每个对象各包含一个 idendity.type 和 value. 引用(Reference) >>> ...

  2. python 拷贝 深拷贝 浅拷贝 赋值

    t = [1,["a","b"]] t_bak = t t_cop = copy.copy(t) t_deep = copy.deepcopy(t) print ...

  3. python 中 深拷贝和浅拷贝的理解

    在总结 python 对象和引用的时候,想到其实 对于python的深拷贝和浅拷贝也可以很好对其的进行理解. 在python中,对象的赋值的其实就是对象的引用.也就是说,当创建一个对象,然后赋给另外一 ...

  4. python中深拷贝和浅拷贝

    python中所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 修改不可变 ...

  5. [py]python的深拷贝和浅拷贝

    Python深复制浅复制or深拷贝浅拷贝 简单点说 copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明 ...

  6. 【04】Python 深拷贝浅拷贝 函数 递归 集合

    1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b    比较两个对象的内容是否相等(可以是不同内存空间) a is b  比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...

  7. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  8. python中的浅拷贝,深拷贝

    直接引用,间接引用 # 1.列表存储的是索引对应值的内存地址,值会单独的开辟一个内存空间 list = ["a","b"] 内存里面存储的就是list[0],l ...

  9. python进阶篇

    python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. ​ import sys ...

随机推荐

  1. JDK源码之Boolean类分析

    一 简介 boolean类型的封装类,将基本类型为boolean的值包装在一个对象中,实现序列化接口,和Comparable接口 额外提供了许多便捷方法,比较简单,直接贴代码分析 二 源码分析 //t ...

  2. Exception | java.security.NoSuchProviderException: no such provider: BC

    背景 今天在用PGP key做JWT签名和验签的时候,转换报了如下错误: org.bouncycastle.openpgp.PGPException: exception on setup: java ...

  3. vuede axios文件下载

    this.loading = true; this.$http({ baseURL: CLOUD_BASE_SERVER_URL,           url: '/audit/auditRun/ex ...

  4. 树莓派4b点亮led灯基本步骤

    方法/步骤1: 首先要了解树莓派上的针脚,下面以树莓派4b为例子 把LED的正极插在GPIO脚上,把负极插在GND上 这里的例子是:正极插在GPIO21 方法/步骤2: 创建脚本 在配置好的树莓派系统 ...

  5. 视觉slam十四讲课后习题ch3-7

    题目回顾: 设有小萝卜一号和小萝卜二号位于世界坐标系中,小萝卜一号的位姿为:q1=[0.35,0.2,0.3,0.1],t2=[0.3,0.1,0.1]^T (q的第一项为实部.请你把q归一化后在进行 ...

  6. [python]bytes和str

    Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] ...

  7. Codeforces 1197E Count The Rectangles(树状数组+扫描线)

    题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保 ...

  8. (原)NSQ源码阅读和分析(1)

    原文出处:https://www.cnblogs.com/lihaiping/p/12324371.html 本文记录自己在阅读和学习nsq源码的时候的一些学习笔记,主要目的是个人总结和方便后期查阅. ...

  9. 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第六节:反爬策略研究

    之前的章节也略有提及反爬策略,本节,我们就来系统的对反爬.反反爬的种种,做一个了结. 从防盗链说起: 自从论坛兴起的时候,网上就有很多人会在论坛里发布一些很棒的文章,与当下流行的“点赞”“分享”一样, ...

  10. 数据清洗:按照进行数据清洗,并将清洗后的数据导入hive数据库中。

    虚拟机: hadoop:3.2.0 hive:3.1.2 win10: eclipse 两阶段数据清洗: (1)第一阶段:把需要的信息从原始日志中提取出来 ip:    199.30.25.88 ti ...