首页 > 其他分享 >12_拷贝

12_拷贝

时间:2022-10-17 18:11:06浏览次数:51  
标签:12 t2 类型 print 拷贝 copy id

拷贝

1.不可变类型和可变类型

知识点:

不可变类型: 字符串 , 元组

可变类型: 列表 , 字典(它的value值) , 集合 (除了可变类型都是不可变类型)

2.浅拷贝和深拷贝

知识点:

python中拷贝模块: copy

1. 浅拷贝: copy.copy()

2. 深拷贝: copy.deepcopy()

3. 结论:
    浅拷贝: 最多拷贝一层
    深拷贝: 可能拷贝多层

3.不可变类型的拷贝

浅拷贝:

# 常见的不可变类型容器:  字符串,元组
from copy import copy


# 字符串浅拷贝
s1 = 'abcdefg'
s2 = copy(s1)
print(s2)
print(id(s1)) # 2671807844656
print(id(s2)) # 2671807844656

print('---------------------------------------')

# 元组的浅拷贝
t1 = (1,2,3,4,5)
t2 = copy(t1)
print(t2)
print(id(t1)) # 1621263292432
print(id(t2)) # 1621263292432

print('---------------------------------------')

# 元组嵌套
tu1 = (1,2,(3,4,5))
tu2 = copy(tu1)
print(tu2)
print(id(tu1)) # 2398684684672
print(id(tu2)) # 2398684684672
print(tu1[2]) # (3, 4, 5)
print(tu2[2]) # (3, 4, 5)
print(id(tu1[2])) # 1483914034944
print(id(tu2[2])) # 1483914034944


# 结论: 对于不可变类型浅拷贝都是直接引用了原来的地址,没有开辟新的地址

深拷贝:

# 常见的不可变类型容器:  字符串,元组
from copy import deepcopy

# 字符串深拷贝
s1 = 'abcdefg'
s2 = deepcopy(s1)
print(s2)
print(id(s1)) # 2614005088368
print(id(s2)) # 2614005088368

print('---------------------------------------')

# 元组的浅拷贝
t1 = (1,2,3,4,5)
t2 = deepcopy(t1)
print(t2)
print(id(t1)) # 2614000130064
print(id(t2)) # 2614000130064

print('---------------------------------------')

# 元组嵌套
tu1 = (1,2,(3,4,5))
tu2 = deepcopy(tu1)
print(tu2)
print(id(tu1)) # 2614006030912
print(id(tu2)) # 2614006030912
print(tu1[2]) # (3, 4, 5)
print(tu2[2]) # (3, 4, 5)
print(id(tu1[2])) # 2614006005504
print(id(tu2[2])) # 2614006005504


# 结论:对于不可变类型深拷贝都是直接引用了原来的地址,没有开辟新的地址

4.可变类型的拷贝

浅拷贝:

# 可变类型容器: 列表 , 字典  , 集合
from copy import copy

# 列表浅拷贝
list1 = [1, 2, 3, 4, 5]
list2 = copy(list1)
print(list2)
print(id(list1))  # 1788150694272
print(id(list2))  # 1788150695104
print('----------------------------------')
# 列表嵌套
a1 = [1, 2, [3, 4, 5]]
a2 = copy(a1)
print(a2)
print(id(a1)) # 2114821471936
print(id(a2)) # 2114821471936

print(a1[2]) # [3, 4, 5]
print(a2[2]) # [3, 4, 5]
print(id(a1[2])) # 1647661700800
print(id(a2[2])) # 1647661700800

# 结论: 对于可变类型浅拷贝最多拷贝一层,其他的保留了原来的引用地址

深拷贝:

# 可变类型容器: 列表 , 字典  , 集合
from copy import deepcopy

# 列表深拷贝
list1 = [1, 2, 3, 4, 5]
list2 = deepcopy(list1)
print(list2)
print(id(list1))  # 2717051408576
print(id(list2))  # 2717051409408

print('----------------------------------')

# 列表嵌套
a1 = [1, 2, [3, 4, 5]]
a2 = deepcopy(a1)
print(a2)
print(id(a1)) # 2717051305344
print(id(a2)) # 2717051409984

print(a1[2]) # [3, 4, 5]
print(a2[2]) # [3, 4, 5]
print(id(a1[2])) # 2717051409664
print(id(a2[2])) # 2717051410432

# 结论: 对于可变类型深拷贝可以拷贝多层,都开辟新的内存地址

5.特殊情况

不可变类型嵌套可变类型

可见,在元组嵌套列表时,由于列表时可变类型,导致深拷贝时,元组本身的不可变类型的数据也被复制了一份,由此可以看到,不可变类型也有可能被重复创建.

from copy import deepcopy

# 不可变类型套可变(面试题)
t1 = (1, 2, [3, 4, 5])
t2 = deepcopy(t1)
print(t2) # (1, 2, [3, 4, 5])
print(id(t1)) # 1974352432448
print(id(t2)) # 1974353561792 此处变化了,受内部可变类型的影响

print(t1[2]) # [3, 4, 5]
print(t2[2]) # [3, 4, 5]
print(id(t1[2])) # 2193229955456
print(id(t2[2])) # 2193229956544
# 特殊情况: 如果不可变类型里面套了可变类型,都会开辟新的内存地址

标签:12,t2,类型,print,拷贝,copy,id
From: https://www.cnblogs.com/nanguyhz/p/16800128.html

相关文章

  • 12-Go设计模式-观察模式
    观察模式样例代码/*观察者模式观察者模式是用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生......
  • 《剑指offer》day12
    合并两个排序的链表题目描述思路双指针自己想的,就普通的双指针,结构化讨论对于第一个节点的确定,自己的思路没问题,提供一种其他思路,用一个伪头节点代码实现双指针......
  • STC32G12K128-ADC
    最近开发一个12VBMS的项目,为了降成本和提高开发周期,硬件工程师选择了一款国产MCU作为主控,基本上能满足功能要求项目主要模块就是AD采样,CAN报文发送,故障诊断今天记录一下A......
  • CVE-2019-1286漏洞分析
    0x00漏洞信息漏洞影响:本地提权漏洞文件:win32kbase.sys漏洞函数:ulGetNearestIndexFromColorref漏洞原因:越界写0x01漏洞分析由于空指针取消引用,此崩溃发生在win32kbas......
  • 【完结】12篇文章告诉你深度学习理论应该学到什么水平
    专栏《AI初识境》正式完结了,在这一个专题中,我们给大家从神经网络背景与基础,讲到了深度学习中的激活函数,池化,参数初始化,归一化,优化方法,正则项与泛化能力,讲到了深度学习中的评......
  • 【完结】给新手的12大深度学习开源框架快速入门项目
    文/编辑|言有三这是一篇总结文,给大家来捋清楚12大深度学习开源框架的快速入门,这是有三AI的GitHub项目,欢迎大家star/fork。​​https://github.com/longpeng2008/yousan.ai......
  • 基于ads1292的心率呼吸信号检测解决方案开发阶段总结
    前记 在医疗可穿戴领域,ads1292是一个无法绕过去的存在。今年几个项目产品都和这个芯片有关系。从不了解到熟悉,算是踩了不少坑吧。对每次的项目进行复盘,是我这些年养成的......
  • 12.运算符
    运算符运算符分为7种分别是算数运算符:+-*/%逻辑运算符:andorlikebetweeninexistsnotallany赋值运算符:=字符串运算符:+比较运算符:=><<=>......
  • QFramework v1.0 使用指南 工具篇:12. TableKit 表数据结构
    在设计UIKit、ResKit等系统时,如果只使用默认的List和Dictionary来管理数据和对象需要做很多的封装。因为本身List和Dictionary支持的查询方式比较单一,如果想做......
  • 【Nginx1.12.2安装步骤】
    前言最近利用时间来进行学习,之前进行过Nginx的入门学习,本篇博客主要记录一下安装Nginx的过程,以便为以后的工作奠定基础.核心步骤一安装gcc环境:yuminstallgcc-c++安装p......