浅拷贝:

>>> 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. python(三)@staticmethod和@classmethod使用和区别

    转载自[1] 一般要用某个类的方法,先要实例这个类. 但是可以通过@staticmethod和@classmethod,直接用“类.方法()”来调用这个方法. 而 @staticmethod和@cla ...

  2. 微信支付-H5网页支付开通流程

    简介  H5 支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付.主要用于触屏版的手机浏览器请求微信支付的场景.可以方便的从外 ...

  3. linux系统内核版本升级

    一.查看Linux内核版本命令(2种方法): 1.cat /proc/version 2.uname -a 二.查看Linux系统版本的命令(3种方法): 1.lsb_release -a 即可列出所 ...

  4. Java基础4-面向对象概述;super();this()

    昨日内容回顾 java基本数据类型: byte : 一个字节,-128 ~ 127 = 256 short : 两个字节, -32768 ~ 32767 int : 四个字节, long : 八个字节 ...

  5. [BugBounty] Sleeping stored Google XSS Awakens a $5000 Bounty

    来源:https://blog.it-securityguard.com/bugbounty-sleeping-stored-google-xss-awakens-a-5000-bounty/ 理解 ...

  6. platform模块

    import platform ''' python中,platform模块给我们提供了很多方法去获取操作系统的信息 如: import platform platform.platform() #获 ...

  7. Python备份MySQL数据库【转】

    #!/usr/bin/env python # coding: utf- import os import time ''' defined variable ''' databases=['hch' ...

  8. requests库入门07-patch请求

    使用data参数提交 设置邮件能见度,这个接口用来设置邮件是公共可见,还是私有的 import requests test_url = 'https://api.github.com' def get ...

  9. Qt学习之路

      Qt学习之路_14(简易音乐播放器)   Qt学习之路_13(简易俄罗斯方块)   Qt学习之路_12(简易数据管理系统)   Qt学习之路_11(简易多文档编辑器)   Qt学习之路_10(Qt ...

  10. 设计模式C++学习笔记之一(Strategy策略模式)

    无意中,从网上下到一本电子书<24种设计模式介绍与6大设计原则>,很好奇这里有24种设计模式,印象中GOF写的<设计模式>(Design Patterns),好像只有23种吧. ...