首页 > 编程语言 >关于python的copy模块内的浅拷贝和深拷贝

关于python的copy模块内的浅拷贝和深拷贝

时间:2022-12-01 01:33:42浏览次数:43  
标签:101 python 列表 对象 可变 拷贝 copy

Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (bindings) 关系,即复制的是对象的引用。对于自身可变(如列表)或者包含可变项的集合对象(如嵌套列表),有必要生成其副本用于改变操作,而避免改变原对象。

所以对于自身不可变的对象,如元组,copy操作没有意义,本质都是赋值,复制对象引用且无法改变。

 

下面讨论可变对象(如列表)的深浅拷贝情况。

1、浅拷贝(shallow):copy.copy(),浅拷贝会复制可变对象的第一层的所有引用。

新建列表a=[1,2,[3,4,[5,6]]] ,变量a里面保存的是内存地址比如101,a指向101,访问a找到101,101三个元素位置保存了另外三个内存地址,即保存整数1的1011,整数2的1012,列表[3,4,[5,6]]的102。102三个元素位置也保存了另外三个内存地址1013,1014,103,同样,103保存着1015,1016。

b=a,赋值操作,b里面保存的跟a完全一样,b也指向101,所以两者有一方变,另一方也跟着变。

c=a.copy(),浅拷贝,在计算机内存中新开辟一块新空间201,存放第一层的引用,201三个元素位指向的地址与101相同。

 

进行操作c[0]=11,即201的第一个位置指向发生了改变,不再指向1011的整数1,而是指向2011的整数11,这时c的值为[11,2,[3,4,[5,6]]],而a、b的值不变。

 

 

接着进行操作:c[2][0]=33,很显然,改变的这个引用是abc三者所共有的,所以abc的值,都发生了改变

 

 

 

同样,列表c新增一个元素c.append("tqs"),那也不关a、b什么事:

 

 

2、深拷贝(deep):copy.deepcopy(),深拷贝会构造一个新的复合对象,然后递归的将原始对象内所有不可变对象的引用和可变对象的副本插入其中。

a=[1,2,[3,4,[5,"6"]

b=a

c=copy.deepcopy(a)

 

 

了解了浅拷贝之后,深拷贝原理就一目了然了。就是将原始对象内所有层次的可变对象都找个新的内存地址去保存其副本,对于不可变对象如int,str,则直接复制引用即可。此时对c进行的任何操作都不会影响到a和b。

标签:101,python,列表,对象,可变,拷贝,copy
From: https://www.cnblogs.com/wangyi0419/p/16939959.html

相关文章

  • Python中的六种基本数据类型
    Python中分为六种基本数据类型不可变类型(又叫静态数据类型,没有增删改操作):数字(number)、字符串(string)、元组(tuple)可变类型(又叫动态数据类型,支持增删改操作):列表(list......
  • Python基本语法
    Python基本语法字面量掌握字面量的含义代码中,被写在代码中的固定的值,称之为字面量常见的字面量类型我们目前了解:整数、浮点数、字符串这三类即可基于print语句完成......
  • python的socket模块
        socket参数使用##socket参数使用参数一:地址簇socket.AF_INETIPv4(默认)socket.AF_INET6IPv6socket.AF_UNIX只能够用于单一的Unix系统......
  • python 循环中 无法释放占用内存
    问题python循环里无法释放占用内存即使手动删除del对象再调用gc回收也无法释放内存以为你del只能强引用的计数器设为-1但是gc回收时会重新检查代码中的引......
  • Python读取csv文件
    1.CSV逗号分隔值,英文全称Comma-SeparatedValues,缩写CSV,有时也称字符分隔值,因为字符分隔值也可以不是逗号,CSV文件以纯文本形式存储表格数据(数字和文本).纯文本意味......
  • python列表处理操作
    1、总结增、删、改、查list=[1,"xiaoming","atao","quangege",10,"a"]#列表增list.append("10")#列表尾部增加list.insert(1,"xxxx")#指定位置增加print(lis......
  • 【NLP开发】Python实现聊天机器人
    文章目录​​1、简介​​​​2、ELIZA​​​​2.1ElizaTest(java)​​​​2.2wadetb/eliza(python)​​​​2.3eliza-py(python)​​​​2.4nltk.chat.eliza(python)​​​​2.......
  • Python 对称加密的使用
    对称加密概述:对称加密就是加密和解密使用同一个密钥;就好比.我要给你邮寄一个箱子.上面怼上锁.提前我把钥匙给了你一把,我一把.那么我在邮寄之前就可以把箱子锁上.然......
  • n1_python数据分析
    1.Python语言及其特征优点:代码编写效率高;程序代码可读性强;可扩展性强;属于解释型语言,支持动态数据类型。缺点:①属于解释型语言,代码执行速度较慢;②在移动终端类应用......
  • 进入python的世界_day42_前端——何为前端、HTTP、HTML、head和body以及常用标签
    一、前端1.何为前端​ 与用户打交道的操作界面即为前端,一般都是做了美化的2.前端核心基础HTML>>>:网页的骨架CSS>>>:网页的样式JS>>>:网页的动态(比如说滑动......