首页 > 其他分享 >列表(list)的深浅拷贝解析

列表(list)的深浅拷贝解析

时间:2023-08-06 17:36:55浏览次数:38  
标签:s1 元素 list 列表 深浅 print 拷贝 copy

一、深浅拷贝

如果希望将列表复制一份,通过列表的内置方法copy就可以实现:

1 s = [[1,2],3,4]
2 s1 = s.copy()
3 print(s)
4 print(s1)

拷贝出的列表s1与原列表s完全一致。

[[1, 2], 3, 4]
[[1, 2], 3, 4]

对s1修改:

复制代码
1 s = [[1,2],3,4]
2 s1 = s.copy()    
3 s1[1] = 'oliver'
4 s1[0][1] = 'hello'
5 print('列表s:',s)
6 print('列表s1:',s1)
复制代码

输出:把列表s1中的元素3修改为'oliver'后,原列表并未受影响。

  将s1中第一个元素[1,2]中的2修改为'hello'时,原列表中也跟着变了。

列表s: [[1, 'hello'], 3, 4]
列表s1: [[1, 'hello'], 'oliver', 4]

问题来了,通过copy方法拷贝列表s得到列表s1,修改s1中的元素后,s中的元素有的没变,有的跟着变了。为什么会出现这种现象?s与s1之间有什么联系呢?二者的内存空间是否完全独立?

 

如下图所示,使用列表内置的copy方法,是将新列表中的元素指向了与原列表相同的内存空间。但是,如果列表中嵌套了列表,拷贝后的列表中嵌套的列表元素指针,指向原列表中嵌套列表的整体地址,而不是指向嵌套列表中元素的内存地址。

 

由此可得,s1[0][1]修改后,s列表中的该元素指针指向的内存空间也会发生改变。

这便是列表的浅拷贝。

 

如果希望拷贝后的列表拥有完全独立的内存空间,则需要一个新的方法深拷贝来实现:

复制代码
1 import  copy
2 s = [[1,2],3,4]
3 s2 = copy.deepcopy(s) 
4 s2[0][1] = 'abc'
5 print('列表s:',s)
6 print('列表s2:',s2)
复制代码

使用copy.deepcopy()方法来拷贝列表,修改嵌套列表中的元素,原列表不受影响。

列表s: [[1, 2], 3, 4]
列表s2: [[1, 'abc'], 3, 4]

 

总结

1、浅拷贝只能拷贝最外层,修改内层则原列表和新列表都会变化。

2、深拷贝是指将原列表完全克隆一份新的。

>>>>>>转载自  Python——列表深浅拷贝 - oliver.lee - 博客园 (cnblogs.com)

 

标签:s1,元素,list,列表,深浅,print,拷贝,copy
From: https://www.cnblogs.com/Zhaolongtao/p/17609609.html

相关文章

  • char*到int[] 内存拷贝存疑
    C++中Array和Vector内存地址都是连续的,那么也可以把一块连续的字符串或二进制数据char*、char[],转成int[]、double[]数据吧。voidtest5(){//假设有一个char*指向字符串的内存数据char*data="hello";size_tdataSize=strlen(data)*4;......
  • 参考示例之“复制对象|拷贝对象|BeanUtils工具类学习”
    //设置需要拷贝的字段Set<String>targetSet=newHashSet<>();targetSet.addAll(Arrays.asList("totalRefund","actualAdvertisingCost","expensesOfTaxation"));//调用拷贝方法copyProperties(com......
  • 前端学习笔记202306学习笔记第四十二天-深拷贝解决循环引用问题2
      ......
  • vue--day54--todolist 中的MyItem 和App 消息发布实现通信
    1.App.vue<template><divid="root"><divclass="todo-container"><divclass="todo-wrap"><!--@addTodo事件名addTodo回调名--><MyHeader@addTodo="addTodo"/><!--父亲给儿子传数据父亲通过数据绑定......
  • 拷贝完hadoop集群后如何恢复网络
    流年似飞雪:结论:拷贝集群后不用重新配置网络知识:ip由四位组成,前三位是网络标识最后一个是端口ip你原先用的主机网络标识符是192.168.10,拷过来的集群的网络标识符为192.168.111,就把第三位的10改成111,网络标识得和拷过来的主机一致,都是192.168.111步骤:查看hadoop......
  • 通过一个实例了解 va_list
    VA_LIS是在C语言中解决【变参问题】的一组宏,【变参问题】是指参数的个数不定,可以传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。其中va_list(VA_LIST是在C语言中解决变参问题的一......
  • Python数据的深浅拷贝
    一、怎么理解深浅拷贝二、本人之前的错误理解(写到最后我会进行提示,以防某些同学跟着我之前的思路走,导致理解混乱,怕自己理解混乱的同学可以不看这部分。) 一、深浅拷贝主要的区别是在于数据进行拷贝的时候,发生的变化浅拷贝:创建一个新对象,然后将原始对象中的元素复制到新对象中......
  • 作者推荐 | 【底层服务/编程功底系列】「底层技术原理」史上最清晰的采用程序员的视角
    背景介绍现在,零拷贝功能在Linux下几乎家喻户晓,但仍有很多人对其了解有限。为了解开这个功能的神秘面纱,我决定撰写一篇关于深入探讨的文章。本文将从用户模式应用程序的角度出发,介绍零拷贝的概念,省略了内核级的技术细节。希望通过本篇文章,可以帮助大家能更好地理解这个有用功能。什......
  • DXP TreeList 目录树
    DXPTreeList目录树1.需求背景需要一个支持勾选,拖动节点,保存各节点顺序的目录树。2.创建目录树在treeList控件中添加两个colunm用来显示绑定数据和显示值。接下来对treeList的属性进行设置//设置列不显示treeList.OptionsView.ShowColumns=......
  • vue--day51----todolist 中App.vue 和 MyItem.vue 类似 父亲和子通信 通过全局事件总
    1.mainjs/***该文件是整个项目的入口文件*///引入VueimportVuefrom'vue'//引入App组件他是所有组件的父组件importAppfrom'./App.vue'//关闭vue的生产提示Vue.config.productionTip=false//constDemo=Vue.extend({})//constd=newDemo();//Vue.pr......