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

深浅拷贝

时间:2023-12-06 16:44:05浏览次数:31  
标签:对象 深浅 print 拷贝 copy id append

深浅拷贝

【1】浅拷贝

  • 使用浅拷贝创造对象,修改原来对象中的可变数据类型

  • 复制的对象也会随着原来的对象改变而改变

    首先,会为整数1分配一个内存空间。 变量a 和 b 都指向了这个内存空间(内存地址相等),所以他们的id相等。

    a = 1
    b = 1
    
    print(id(a)) # 2057422768
    print(id(b)) # 2057422768
    print(a is b) # True
    
    a = [1, 2, 3]
    b = list(a)  # 可以通过list 对列表进行浅拷贝
    c = a.copy() # 也可以通过copy函数进行拷贝
    
    # 浅拷贝后,a/b/c的id 各不相同,说明指向了不同的内存地址-- 即 生成了新的对象
    print(id(a)) # 16301992
    print(b, "id:", id(b)) # id:16562024
    print(c, "id:", id(c)) # id:16561960
    
    print(a == b) # True  值相同 返回True
    print(a is b) # False  id不同所以 is比较返回False
    
    # 给列表a 添加元素4
    a.append(4)
    print(a) # [1, 2, 3, 4]
    print(b, c) # [1, 2, 3] [1, 2, 3]  b和c 不受影响
    
  • 以上可以看出,浅拷贝会分配一个新的内存空间,创建一个新的对象。但是如果被拷贝对象中有可变对象会怎么样呢?在Python中 通过 copy.copy() 来实现深拷贝。

    a = [1, 2, [3, 4]]
    b = a.copy()
    print(id(a)) # 23967528
    print(id(b)) # 21738984
    # 改变a中的可变对象
    a[-1].append(5)
    print(a)
    # 在给a新增元素6
    a.append(6)
    # [1, 2, [3, 4, 5], 6]
    print(a)
    # [1, 2, [3, 4, 5]]
    print(b)
    

【2】深拷贝

  • 所谓深拷贝呢,就是重新分配一个内存空间(新对象),将原对象中的所有元素通过递归的方式进行拷贝到新对象中。在Python中 通过 copy.deepcopy() 来实现深拷贝。

    import copy
    a = [1, 2, (3, 4)]
    # 深拷贝
    b = copy.deepcopy(a)
    # 因为生成了新的对象所以,返回False
    print(a is b)
    a[-1] += (5,)
    a.append(6)
    print(a) # [1, 2, (3, 4, 5), 6]
    print(b) # [1, 2, (3, 4)] 深拷贝后的对象,根本不受原对象的任何影响
    

标签:对象,深浅,print,拷贝,copy,id,append
From: https://www.cnblogs.com/banchengyanyu/p/17879892.html

相关文章

  • 浅谈深浅拷贝
    【一】深浅拷贝深拷贝(deepcopy)和浅拷贝(shallowcopy)是在Python中用于复制对象的两种方式。它们的作用如下:1.浅拷贝:浅拷贝创建一个新的对象,但是该新对象的元素是对原始对象的引用。换句话说,浅拷贝只复制了对象的引用,而不是对象本身。当原始对象中的元素发生变化时,浅拷贝的对象也......
  • 不含指针的结构体赋值实现,直接内存拷贝
    #include<stdio.h>#include<stdlib.h>structA{ intc; charb[20]; charstrs[10][10]; intk;};intmain(){ //Aa={...};//帮我初始化 structAa={ 1,//Initializecwithsomeinteger "ExampleString",//Initialize......
  • 深拷贝和浅拷贝
    在C++中,深拷贝和浅拷贝是两种不同的对象复制方式:浅拷贝:当我们创建一个对象的副本时,如果仅仅复制所有成员变量的数据,那么这就是浅拷贝。这在所有的变量都在栈内存中分配时工作得很好1。但是,如果有些变量是在堆内存中动态分配的,那么复制的对象变量也会引用同一块内存位置1。......
  • JS赋值、浅拷贝、深拷贝的区别
    在说明它们的区别之前,首先需要了解JS的数据类型和它们的存放位置。  数据类型基本数据类型:String、Number、Boolean、Undefined、Null、Symbol(es6)、BigInt(es6)引用数据类型:Object  存放位置基本数据类型是存放在栈中的数据段,直接存储的就是值本体。引用数据类型是存......
  • docker 拷贝docker中文件,并获取最新
    1、2、#!/bin/bashdate_str=$(date+_%Y_%m_%d_%H_%M_%S.sql.gz)echo'开始备份数据'$date_str#获取容器idmysqlid=`dockerps-aqf"name=mysql57"`#进入mysql容器dockerexec-i${mysqlid}/bin/bash<<'EOF'mysqldump-hlocalhost-uroot......
  • Python之深浅拷贝
    浅copy:   1.是把列表本身独立,里面的元素是被两个列表共享的   2.当其中一个列表中的元素被改变时,另一个列表中的元素不会随之变化。   3.当列表里面还有列表时,修改内部列表的内容时,另一个列表中的内部列表也会随之变化a1=["a","b","c","aa"]b1=a1a1[0]="1"prin......
  • 自定义拷贝程序
    【一】需求介绍制作一个简易的文件拷贝程序【二】功能分析拷贝程序输入原始文件路径输入目标文件路径【三】代码实现#1.获取想要拷贝的文件路径source_file_path=input('请输入想要拷贝的文件路径>>>:').strip()#2.获取目标路径(到底拷贝到哪里)target_file_pat......
  • 深度拷贝
    1、java后台BeanUtils.copyProperties不是深拷贝要实现高性能且安全的深度克隆方法还是实现Serializable接口,多层克隆时,引用类型均要实现Serializable接口。例如:publicclassBaseEntityextendsBaseCreatedUpdatedDeletedEntityimplementsSerializable 参考文献:https:/......
  • Linux服务器远程文件拷贝两种方法介绍
    假设有两台linux服务器,如何将111.22.3.64上的/usr/local/example-server目录下的所有文件和目录拷贝到55.166.77.246的/usr/local/example-server目录下?  Linux服务器远程文件拷贝两种方法介绍要从一个Linux服务器拷贝文件到另一个Linux服务器,可以使用scp命令或rsync命令。以下是......
  • linux 拷贝命令
    基本操作最简单的把文件a复制到文件夹file_a中,使用:cpafile_a,即可。复制多个文件想把多个文件如a,b,c复制到文件夹file_a中,使用:cpabcfile_a,即可。复制一个文件夹下的多个文件如果我们想把文件夹file_a中的多个文件,如a,b,c复制到文件夹file_b中,该怎么办呢?用最土的方法,cpfile......