浅拷贝:

>>> a = [1, 2, 3]
>>> b = a
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
2154993843464
>>> id(b)
2154993843464

浅拷贝把a 赋值给了b,并不是直接再给b来了一个列表而是a和b都指向了同一个地址。

深拷贝:

使用copy模块下的deepcopy()来完成深拷贝

>>> import copy
>>> a = [1, 2, 3]
>>> b = copy.deepcopy(a)
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
2154997247496
>>> id(b)
2154997247688

深拷贝浅拷贝的区别

浅拷贝:

a = [1, 2, 3]
b = a
print(f"{a}")
print(f"{b}")
a.append(888)
print("添加后的数据:")
print(f"{a}")
print(f"{b}") 执行结果:
[1, 2, 3]
[1, 2, 3]
添加后的数据:
[1, 2, 3, 888]
[1, 2, 3, 888]

深拷贝:

import copy

a = [1, 2, 3]
b = copy.deepcopy(a)
print(f"{a}")
print(f"{b}")
a.append(888)
print("添加后的数据:")
print(f"{a}")
print(f"{b}") 执行结果:
[1, 2, 3]
[1, 2, 3]
添加后的数据:
[1, 2, 3, 888]
[1, 2, 3] # <------区别在此

从上面的代码可以看出浅拷贝变更被拷贝对象的内容,拷贝方也会随之更改,而深拷贝则不受影响。

多层拷贝

import copy

a = [1, 2, 3]
b = [1, 2, 3]
c = [a, b] # 浅拷贝
d = c
print("--------华丽的分割线--------")
print(f"c -> {id(c)}")
print(f"d -> {id(d)}")
print("--------华丽的分割线--------") # 深拷贝
e = copy.deepcopy(c) # deep 深
print(f"c -> {id(c)}")
print(f"e -> {id(e)}")
print("--------华丽的分割线--------") # 现在这个e到底是拷贝的c还是a和b呢 # 开始验证
c[0].append("我是新来的")
print(c[0])
print(e[0]) 执行结果:
--------华丽的分割线--------
c -> 2133324736584
d -> 2133324736584
--------华丽的分割线--------
c -> 2133324736584
e -> 2133324736520
--------华丽的分割线--------
[1, 2, 3, '我是新来的']
[1, 2, 3] # 未变动证明直接对a 和 b进行了一份深拷贝,而不是对c进行了一份拷贝

注意: 多层拷贝时使用copy.deepcopy()会直接跟着引用走,拷贝最终指向【如果使用的是e = copy.copy©就只会拷贝括号中的对象©,不会拷贝到上一层不会拷贝最终指向】,如果拷贝的是不可变数据类型(如:元组)将不能进行深拷贝

总结:

当需要数据共享时使用浅拷贝,数据独立不进行共享时使用深拷贝

Python中什么是深拷贝和浅拷贝且有什么区别的更多相关文章

  1. Python中复制、深拷贝和浅拷贝的区别

    深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...

  2. python 中list的深拷贝和浅拷贝

    注意:这里提到是list的隐式转换例如 a=[1,2,3]def test(n):n[2] = n[2]*2c=a此时是浅拷贝,当调用test(c)时,可以看到a也发生了变化c=[1,4,3]a=[1 ...

  3. python中赋值,深拷贝,浅拷贝区别

    这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...

  4. Python中内置数据类型list,tuple,dict,set的区别和用法

    Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...

  5. Python中列表,元组,字典,集合的区别

    参考文档https://blog.csdn.net/Yeoman92/article/details/56289287 理解Python中列表,元组,字典,集合的区别 列表,元组,字典,集合的区别是p ...

  6. Python中变量、赋值、浅拷贝、深拷贝

    https://www.cnblogs.com/LetMe/p/6724555.html 在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用 ...

  7. python的复制,深拷贝和浅拷贝的区别

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...

  8. python的赋值,深拷贝和浅拷贝的区别

    原文地址https://www.cnblogs.com/xueli/p/4952063.html 赋值:a = [1,2,3,["a","b"]]  b=a,那 ...

  9. python的复制,深拷贝和浅拷贝的区别(转)

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...

随机推荐

  1. 浏览器修改或添加Cookie--chrome插件【edit this cookie】、【postman】

    需求背景:某天用浏览器请求某个 API 提示: {"RESULT_TYPE" : -1 , "STATE" : 401 , "RESULT_DESC& ...

  2. ubuntu14.04升级mysql5.5至mysql5.7

    原文链接:https://www.cnblogs.com/os-python/p/6842485.html 1.下载mysql-apt的配置包,并安装 wget https://dev.mysql.c ...

  3. 为什么可逆矩阵又叫“非奇异矩阵(non-singular matrix)”?

    最近在捡回之前的线性代数知识,在复习可逆矩阵的时候,发现有的书上把可逆矩阵又称为非奇异矩阵,乍一看名字完全不知所云,仔细一分析,还是不明白.要想弄明白,还是得从英文入手,下面的解释主要从这里得来的Wh ...

  4. FLASK-----基本知识(一)

    中文文档(http://docs.jinkan.org/docs/flask/) 英文文档(http://flask.pocoo.org/docs/0.11/) FLASK介绍 Flask是一个基于P ...

  5. OVS-----CentOS7上搭建基于Open vSwitch的VxLAN隧道实验

    一.关于VXLAN VXLAN 是 Virtual eXtensible LANs 的缩写,它是对 VLAN 的一个扩展,是非常新的一个 tunnel 技术,在Open vSwitch中应用也非常多. ...

  6. cartographer 最新版安装测试

    在官网的基础上稍加修改,但保证代码都是最新的 我的系统配置: Debian9 strech,  ROS lunar 该方法对 ubuntu 系列操作系统以及其他ROS版本同样适用. 1.  安装依赖库 ...

  7. HDOJ 1217 Arbitrage (最短路)

    题意:每两种货币之间都有不同的汇率  如果换回自己最后是赚的 输出Yes 否则是No 因为最多只有三十种货币 所以用Floyd是可行的 与一般的最短路板子不同的地方 汇率是要乘而不是加 如果乘上一个小 ...

  8. GeoDesc: Learning Local Descriptors by Integrating Geometry Constraints

    这篇论文提出了一种新的局部描述子学习方法,有一些点值得学习,记录下来以供参考.文章中涉及了一些3D reconstruction.structure from 的知识,不是很了解,所以理解可能有偏颇. ...

  9. hibernate框架学习之对象状态

    lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...

  10. Media Query-响应式布局

    做响应式网站的时候,一定要在页面头部加入如下的声明: <meta name="viewport" content="width=device-width, init ...