首页 > 其他分享 >深浅拷贝

深浅拷贝

时间:2024-05-15 09:31:30浏览次数:18  
标签:list 列表 num 深浅 print new 拷贝

深浅拷贝

【一】深浅拷贝问题

给一个列表 基于这个列表进行更改生成新列表

方法1: 复制

对原来的列表不生效

num_list = [1, 2, 3]
num_list_new = [1, 2, 3]
num_list_new.append(4)

print(num_list)
print(num_list_new)

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

方法2:用新的变量名指向原来的列表

对新列表和原来的列表都生效

num_list = [1, 2, 3]
num_list_new = num_list
num_list_new.append(4)

print(num_list)
print(num_list_new)

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

【二】复制原本的列表会产生的问题

新列表是复制出来的副本

【1】修改新列表会影响到原本的列表

----->浅拷贝

【2】修改新列表不会影响原本的列表

----->深拷贝

【三】在python代码中实现深浅拷贝

导入模块

【1】浅拷贝

import copy

# 必须是修改源数据类型中的可变数据类型才生效
# copy.copy()
num_list = [1, 2, 3, 4,[1,2,3]]
num_list_new = copy.copy(num_list)

# 当新列表在列表中的可变数据中改变时,旧的列表也会随之改变
num_list_new[4].append(5)

print(num_list_new,id(num_list_new))
print(num_list,id(num_list))

#id 不同 不是同一个列表
[1, 2, 3, 4, [1, 2, 3, 5]] 1558382145920
[1, 2, 3, 4, [1, 2, 3, 5]] 1558382145664

# 当新列表在列表中的不可变数据中改变时,旧的列表不会变

num_list_new.append(5)

print(num_list_new,id(num_list_new))
print(num_list,id(num_list))

[1, 2, 3, 4, [1, 2, 3], 5] 1553318834560
[1, 2, 3, 4, [1, 2, 3]] 1553318834304

【2】深拷贝

import copy

# 【2】.深拷贝
# 深拷贝会将原来的列表完全复制一份,不会影响到原先的列表
# copy.deepcopy()
num_list = [1, 2, 3, 4,[1,2,3]]
num_list_new = copy.deepcopy(num_list)

num_list_new[4].append(5)
print(num_list_new,id(num_list_new))
print(num_list,id(num_list))

[1, 2, 3, 4, [1, 2, 3, 5]] 2110769688960
[1, 2, 3, 4, [1, 2, 3]] 2110769688704

【3】总结

  • 浅拷贝只会复制顶层对象,而不会影响到深层的可变数据类型

  • 在复制出来的列表,列表中的列表引用的是原来列表的引用

  • 深拷贝会递归的复制整个对象的数据结构

  • 在复制出来的列表,列表中的列表引用的是新列表的引用

![屏幕截图 2024-04-08 151236](C:\Users\jy255\Pictures\Screenshots\屏幕截图 2024-04-08 151236.png)

  • 上为浅拷贝
  • 下为深拷贝

标签:list,列表,num,深浅,print,new,拷贝
From: https://www.cnblogs.com/yi416/p/18192742

相关文章

  • C#中的对象深拷贝和浅拷贝
    1.浅拷贝publicclassPerson{publicPerson(){this.Address=newAddress();}publicstringName{get;set;}publicintAge{get;set;}publicAddressAddress{get;set;}publicPersonClone(){re......
  • 深入探索JavaScript中的structuredClone:现代深拷贝的解密指南
    在JavaScript中,实现深拷贝的方式有很多种,每种方式都有其优点和缺点。今天介绍一种原生JavaScript提供的structuredClone实现深拷贝。下面列举一些常见的方式,以及它们的代码示例和优缺点:1.使用JSON.parse(JSON.stringify(obj))代码示例:functiondeepClone(obj){re......
  • C#中的对象深拷贝和浅拷贝
    目录C#中的对象深拷贝和浅拷贝概述1.浅拷贝2.深拷贝总结引用C#中的对象深拷贝和浅拷贝概述在C#中,对象拷贝是指将一个对象的副本创建到另一个对象中。对象拷贝通常用于数据传输或创建对象的新实例。C#中有两种主要的拷贝方式:浅拷贝和深拷贝1.浅拷贝浅拷贝是指只拷贝对象的......
  • 利用标准IO函数接口实现文件拷贝,把本地磁盘的文件A中的数据完整的拷贝到另一个文本B中
    利用标准IO函数接口实现文件拷贝,把本地磁盘的文件A中的数据完整的拷贝到另一个文本B中,如果文本B不存在则创建,要求文本A的名称和文本B的名称通过命令行传递,并进行验证是否正确。/******************************************************************** author :18312615416@1......
  • [转帖]Nginx流量拷贝 - 运维笔记
    https://www.cnblogs.com/kevingrace/p/14001080.html 一、Nginx的ngx_http_mirror_module模块实现流量复制介绍Nginx专门提供了ngx_http_mirror_module模块,用来实现流量拷贝。将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处:可以验证功能是否正常,以及服务......
  • 浅拷贝与深拷贝
    深拷贝,两个指针(PA,PB)指向同一块内存,PA变化,PB也跟着变化。深拷贝,两个指针(PA,PB)指向不同内存,PA变化,PB不受影响。以Python写个demoimportcopy#原始列表original_list=[[1,2,3],[4,5,6]]#浅拷贝shallow_copy=copy.copy(original_list)#修改浅拷贝的第一......
  • 提高安全性,优雅实现拷贝与交换:C++中的Copy-and-Swap惯用法
     概述:拷贝并交换(Copy-and-Swap)是C++编程中的惯用法,用于实现赋值操作符和确保异常安全的拷贝构造函数。其核心思想是通过拷贝构造函数创建临时副本,再通过交换确保操作的异常安全性。这种方法在C++11之前和之后都适用,但在C++11中,移动语义和右值引用的引入使得实现可以更加高效。......
  • 低开开发笔记(五):修bug-深拷贝与浅拷贝
    好家伙 今天遇到一个bug 0.问题描述描述如下: 代码如下:copynodefunc(){this.copynode=this.model.selected},affixnode(){constid=this.model.selected.wid-1;constgoodnode=this.copynode......
  • Visual Studio 项目发布时将资源目录文件夹所有文件拷贝到发布路径
    1.背景在.NET项目开发过程中,时常需要将资源文件夹复制到生成目录,以确保这些资源随项目输出。2.方法找到当前项目例如:xxxxx.Api 双击进入,对 .csproj文件内容,加入如下信息:<TargetName="CopyResourcesPublish"AfterTargets="Publish"><ItemGroup><Resource......
  • Java引用拷贝、浅拷贝、深拷贝
    原链接在开发、刷题、面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况,这种情况就叫做拷贝。拷贝与Java内存结构息息相关,搞懂Java深浅拷贝是很必要的!在拷贝中这里就分为引用拷贝、浅拷贝、深拷贝进行讲述。引用拷贝引用拷贝会生成一个新的对象引用地址,但是两个最......