1. """
  2. 一、赋值在python中就是简单的对象引用
  3. """
  4. list_a = ["aaa", "bbb"]
  5. list_b = list_a
  6. print(id(list_a), id(list_b)) # 输出 2127728239240 2127728239240
  7.  
  8. # 通过上面操作可以看出,list_b和list_a指向同一片内存,list_b不过是list_a的别名,是引用,除了list_b这个名字以外,没有其它的内存开销。。
  9. # 修改了list_a,就影响了list_b;同理,修改了list_b就影响了list_a
  10.  
  11. list_b[1] = "ccc"
  12. print(f"list_a = {list_a}") # 输出 list_a = ['aaa', 'ccc']
  13. print(f"list_b = {list_b}") # 输出 list_b = ['aaa', 'ccc']
  14.  
  15. """
  16. 二、浅拷贝
    在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,
    而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的。
    """
  17. list_c = ["aaa", "bbb"]
  18. list_d = list_c.copy()
  19. print(id(list_c), id(list_d)) # 输出 1803491942920 1803491976008
  20. # 通过id可以看出,发现它们也不指向同一片内存,也就是说浅拷贝产生的list_d不再是list_c了,使用is也可以发现他们不是同一个对象。
  21.  
  22. for x in list_c:
  23. print(id(x)) # 输出 "aaa" = 1803491959280 "bbb" = 1803491948000
  24. for y in list_d:
  25. print(id(y)) # 输出 "aaa" = 1803491959280 "bbb" = 1803491948000
  26. # 但是当我们查看元素的id时,可以看到两个对象包含的元素的地址是相同的。
  27.  
  28. list_d[1] = "ccc"
  29. print(f"list_c = {list_c}") # 输出 list_c = ['aaa', 'bbb']
  30. print(f"list_d = {list_d}") # 输出 list_d = ['aaa', 'ccc']
  31. # 在这种情况下,list_c和list_d是不同的对象,修改list_d理论上不会影响list_c。
  32.  
  33. list_e = [["aaa", "bbb"], "ccc"]
  34. list_f = list_e.copy()
  35. list_f[0][1] = "ccc"
  36. print(f"list_e = {list_e}") # 输出 list_e = [['aaa', 'ccc'], 'ccc']
  37. print(f"list_f = {list_f}") # 输出 list_e = [['aaa', 'ccc'], 'ccc']
  38. # 但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,情况就不一样了。
  39. # 通过list_f[0][1] = "ccc" 修改list_f后,将发现list_e也发生了变化。这是因为,修改嵌套的元素的内存地址是一样,与前面赋值原理一样。

  1. """
  2. 三、深拷贝
  3.  
  4. 深拷贝只有一种形式,copy模块中的deepcopy函数。
  5. 和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。
  6. 同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响。
  7. 因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。
  8. """
  9. """
  10. ### 关于拷贝的警告  
  11. 1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。
  12. 2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。
  13. """

四、浅拷贝与深拷贝中的注意点

  • 列表的切片以及字典的copy方法都是浅拷贝

  

  

  • 如果对一个全部都是不可变类型的数据用copy.copy()或copy.deepcopy()进行拷贝,他们结果相同,都是引用指向

   

  • 如果拷贝的是一个拥有可变类型的数据,即使元组是最顶层,那么deepcopy依然是 深拷贝,而copy.copy()拷贝的还是指向

  

python的赋值、浅拷贝和深拷贝的更多相关文章

  1. 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    引用:https://www.jb51.net/article/142775.htm 列表赋值: 1 2 3 4 5 6 7 >>> a = [1, 2, 3] >>&g ...

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

    在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b

  3. Python 引用、浅拷贝、深拷贝解析

    引用 Python是动态数据类型的语言,故在对变量进行赋值时是不用制定变量类型的. 或者说,你可以把变量赋值的过程,当作是贴一个标签,去引用该数据. 看下面的例子: In [54]: a=4 In [ ...

  4. python 基础之浅拷贝与深拷贝

    浅拷贝与深拷贝 1.普通赋值 例1: a = 15b = aa = 16print(b)#例2:lst1 = [1,2,3]lst2 = lst1lst1.append(4)print(lst2)#这 ...

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

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

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

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

  7. python中赋值-浅拷贝-深拷贝之间的关系

    赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...

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

    1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...

  9. Python核心编程--浅拷贝与深拷贝

    一.问题引出浅拷贝 首先看下面代码的执行情况: a = [1, 2, 3] print('a = %s' % a) # a = [1, 2, 3] b = a print('b = %s' % b) ...

  10. Python中的浅拷贝与深拷贝

    编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...

随机推荐

  1. jQuery遍历的几种方式

    一.jQuery对象遍历 1 <script type="text/javascript" src="js/jquery-3.4.1.js">< ...

  2. 如何用three.js实现数字孪生、3D工厂、3D工业园区、智慧制造、智慧工业、智慧工厂-第十课

    文章前,先聊点啥吧. 最近元宇宙炒的挺火热,在所有人都争相定义元宇宙的时候,资本就开始着手入场了.当定义明确,全民皆懂之后,风口也就过去了. 前两天看到新闻,新世界CEO宣布购入最大的数字地块,这块虚 ...

  3. 【JAVA今法修真】 第二章 一气化三清 线程分心念

    这是我的微信公众号,希望有兴趣的朋友能够一起交流,也希望能够多多支持新人作者,你的每一份关注都是我写文章的动力:南橘ryc 天有八纪,地分九州,万法仙门与天道剑宗一并坐落在东北方通辽州. 与李小庚想象 ...

  4. pwnable_start & ciscn_2019_es_2 & ez_pz_hackover_2016 & pwn2_sctf_2016

    花了两天时间做了这四道题,感觉收获很多.但是这种收获感觉写文章写不出自己的思路,就录制了一个视频. pwnable_start 这道题考察了系统调用,shellcode的编写,和动态调试的知识. ci ...

  5. [BUUCTF]PWN14——not_the_same_3dsctf_2016

    [BUUCTF]PWN14--not_the_same_3dsctf_2016 题目网址:https://buuoj.cn/challenges#not_the_same_3dsctf_2016 步骤 ...

  6. Linux驱动实践:一起来梳理中断的前世今生(附代码)

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  7. InnoDB学习(五)之数据库锁

    InnoDB存储引擎的默认隔离级别事可重复读,MVCC多版本并发控制仅仅解决了快照读情况下的数据隔离,而对于当前读,InnoDB通过锁来进行并发控制. InnoDB锁 本文主要参考了MySQL官方文档 ...

  8. Spring学习(二)三种方式的依赖注入

    1.前言 上一篇讲到第一个Spring项目的创建.以及bean的注入.当然.注入的方式一共有三种.本文将展开细说. 1.set注入:本质是通过set方法赋值 1.创建老师类和课程类 1.Course ...

  9. SpringBoot 整合MinIO

    引入依赖 <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifact ...

  10. summernote富文本的简单使用

    官方地址:https://summernote.org/ html代码 <div class="summernote" id="summernote" & ...