python中关于深拷贝和浅拷贝的详解

概述

在python的语法中,有两种变量的拷贝方式
一种是深拷贝,一种是浅拷贝

我们先说深拷贝

语法

这里需要通过导入系统的copy模块中的deepcopy才可以
import copy
新的对象 = copy.deepcopy(被拷贝对象)

解释

深拷贝是将操作对象整体复制出来一份,与其原来拷贝的对象没有联系,拷贝后重新分配一个内存地址
对拷贝和的对象进行各种操作,原对象也不收到影响

再来说浅拷贝

语法

浅拷贝的语法很多
新的对象 = 被拷贝对象
新的对象 = 被拷贝对象.copy()
新的对象 = lis被拷贝对象t0[:]
import copy
新的对象 = copy.copy(被拷贝对象)

解释

浅拷贝中,虽然对象本身的地址发生了改变,但是对象中包含的数据还是原来的地址,仅仅是传递过来一个引用
指向了原来对象中的数据,如果改变其中一个对象中的内容,其另一方也会对应更改
(这里需要注意,如果更改的数据类型是不可更改对象,则改变的是其引用,本身没有改变,只是这个位置的数据换成了另一个地址中的)

下面看一下代码的测试(小编的测试环境是python3.8版本)


import copylist0 = [['abc'], '秋叶夏风']
list1 = list0
list2 = list0.copy()
list3 = list0[:]
list4 = copy.copy(list0)
list5 = copy.deepcopy(list0)
list6 = copy.deepcopy(list0)print('0', list0, '拷贝的对象的地址:', id(list0), '第一个元素的地址:', id(list0[0]))
print('1', list1, '拷贝的对象的地址:', id(list1), '第一个元素的地址:', id(list1[0]))
print('2', list2, '拷贝的对象的地址:', id(list2), '第一个元素的地址:', id(list2[0]))
print('3', list3, '拷贝的对象的地址:', id(list3), '第一个元素的地址:', id(list3[0]))
print('4', list4, '拷贝的对象的地址:', id(list4), '第一个元素的地址:', id(list4[0]))
print('5', list5, '拷贝的对象的地址:', id(list5), '第一个元素的地址:', id(list5[0]))
print('6', list6, '拷贝的对象的地址:', id(list6), '第一个元素的地址:', id(list6[0]))print('---------------------------------改变拷贝对象的内容--------------------------------')list1[0] = 1
list2[0] = 2
list3[0] = 3
list4[0][0] = 4
list5[0][0] = 5
list6[0] = 6print('0', list0, '拷贝的对象的地址:', id(list0), '第一个元素的地址:', id(list0[0]))
print('1', list1, '拷贝的对象的地址:', id(list1), '第一个元素的地址:', id(list1[0]))
print('2', list2, '拷贝的对象的地址:', id(list2), '第一个元素的地址:', id(list2[0]))
print('3', list3, '拷贝的对象的地址:', id(list3), '第一个元素的地址:', id(list3[0]))
print('4', list4, '拷贝的对象的地址:', id(list4), '第一个元素的地址:', id(list4[0]))
print('5', list5, '拷贝的对象的地址:', id(list5), '第一个元素的地址:', id(list5[0]))
print('6', list6, '拷贝的对象的地址:', id(list6), '第一个元素的地址:', id(list6[0]))

结果如下:

D:\Python38\python.exe E:/PycharmProjects/python_August/day09/关于列表的拷贝问题.py
0 [['abc'], '秋叶夏风'] 拷贝的对象的地址: 2209540405760 第一个元素的地址: 2209541417472
1 [['abc'], '秋叶夏风'] 拷贝的对象的地址: 2209540405760 第一个元素的地址: 2209541417472
2 [['abc'], '秋叶夏风'] 拷贝的对象的地址: 2209540405888 第一个元素的地址: 2209541417472
3 [['abc'], '秋叶夏风'] 拷贝的对象的地址: 2209541418112 第一个元素的地址: 2209541417472
4 [['abc'], '秋叶夏风'] 拷贝的对象的地址: 2209541417152 第一个元素的地址: 2209541417472
5 [['abc'], '秋叶夏风'] 拷贝的对象的地址: 2209541418176 第一个元素的地址: 2209541417792
6 [['abc'], '秋叶夏风'] 拷贝的对象的地址: 2209541417856 第一个元素的地址: 2209541416896
---------------------------------改变拷贝对象的内容--------------------------------
0 [1, '秋叶夏风'] 拷贝的对象的地址: 2209540405760 第一个元素的地址: 140708592568128
1 [1, '秋叶夏风'] 拷贝的对象的地址: 2209540405760 第一个元素的地址: 140708592568128
2 [2, '秋叶夏风'] 拷贝的对象的地址: 2209540405888 第一个元素的地址: 140708592568160
3 [3, '秋叶夏风'] 拷贝的对象的地址: 2209541418112 第一个元素的地址: 140708592568192
4 [[4], '秋叶夏风'] 拷贝的对象的地址: 2209541417152 第一个元素的地址: 2209541417472
5 [[5], '秋叶夏风'] 拷贝的对象的地址: 2209541418176 第一个元素的地址: 2209541417792
6 [6, '秋叶夏风'] 拷贝的对象的地址: 2209541417856 第一个元素的地址: 140708592568288Process finished with exit code 0

python中关于深拷贝和浅拷贝的详解相关推荐

  1. C++中的深拷贝和浅拷贝(详解)

    2020-07-13 拷贝构造函数是一种特殊的构造函数,在创建对象时,它是使用同一类中之前创建过的对象来初始化新创建的对象.如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造 ...

  2. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  3. python中的深拷贝与浅拷贝

    浅拷贝的时候,修改原来的对象,深拷贝的对象不会发生改变. 对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷 ...

  4. java 深拷贝_java 深拷贝与浅拷贝机制详解

    java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定 ...

  5. python argv 详解_对python中的argv和argc使用详解

    主要问题 为什么argv中第一个,即index=0的内容就是文件名? python中argc是用什么实现的? 概念解释 argc:argument counter,命令行参数个数 argv:argum ...

  6. Python中的__name__和__main__含义详解

    背景 在写Python代码和看Python代码时,我们常常可以看到这样的代码: ? 1 2 3 4 5 def main():     ...... if __name__ == "__ma ...

  7. python的raw_ input是什么意思-对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  8. python中str和input_对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  9. python3 isinstance用法_对python中assert、isinstance的用法详解

    1. assert 函数说明: Assert statements are a convenient way to insert debugging assertions into a program ...

最新文章

  1. JAVA中indexOf函数和lastindexOf函数
  2. JAVA操作Excel表格
  3. windows下最好的围棋_学围棋能使学习成绩提高吗?
  4. 一个文章表的 MySQL 索引怎么建立合理
  5. 查询端口被什么程序占用及停止的方法及netstat的妙用
  6. 深度装机大师一键重装_深度一键重装系统软件
  7. matlab三维数据转置,【转】求matlab三维数组转置函数
  8. 证券投资基金名词解释
  9. elasticsearch之analysis
  10. Pylab Plotting
  11. smartbi连接mysql数据库_数据源连接 - Smartbi V7 帮助中心 - Smartbi 在线知识中心
  12. UniPro、Bugzilla和Teambition 缺陷管理工具优劣势对比
  13. 杭州烟花爆炸事故无人重伤-游客衣服包裹头逃生-杭州-烟花爆炸-烧伤
  14. easyui 简单风格的遮罩
  15. 【.net 深呼吸】自己动手来写应用程序设置类
  16. Apache PdfBox 2.0.X 版本解析PDF文档(文字和图片)
  17. Element_Table的单元格合并
  18. 【开源项目】Flutter版 玩安卓,android开发模拟器推荐
  19. 任何人都能看得懂的网络协议之 ARP
  20. oracle 标示符太长,Oracle PLS-00114: 标识符 ' ' 太长

热门文章

  1. 开发人员眼中最好的代码编辑器是谁?
  2. 网站性能优化的三重境界
  3. 研发管理:产品研发团队的早会
  4. JSON字符串转换为Map
  5. 查看VMware上虚拟机的 ip 地址
  6. Mysql 无法插入中文,中文乱码解决
  7. 网络性能测试工具iperf详细使用图文教程【转载】
  8. python 列表的推导器和内置函数
  9. shell编程中date用法(转)
  10. Tomacat服务器的安装和配置