当前位置: 首页 > news >正文

5.4Python之可变类型与列表的深浅拷贝

【1】可变类型与不可变类型

        在Python中,数据类型可以分为可变类型(Mutable)不可变类型(Immutable)。这指的是对象在创建后是否可以更改其值或状态。

不可变类型是指创建后不能更改其值或状态的对象。如果对不可变类型的对象进行修改,将会创建一个新的对象,原始对象的值保持不变。在修改后,对象的身份标识(即内存地址)会发生变化

以下是Python中常见的不可变类型:

整数(Integer)

浮点数(Float)

布尔值(Boolean)

字符串(String)

元组(Tuple)

可变类型是指可以在原地修改的对象,即可以改变其值或状态。当对可变类型的对象进行修改时,不会创建新的对象,而是直接修改原始对象。在修改后,对象的身份标识(即内存地址)保持不变。

Python中常见的可变类型:

列表(List)

字典(Dictionary)

        对于可变类型,可以通过方法调用或索引赋值进行修改,而不会改变对象的身份标识。而对于不可变类型,任何修改操作都会创建一个新的对象。

【2】可变类型的存储方式

l = [1,2,3] # 存储

【3】可变类型的变量传递

变量实际上是对对象的引用。变量传递的核心是两个变量引用同一地址空间。

# 案例1:
x = 1
y = x
x = 2
print(y)    # 1
print(id(x))    # 140710087838168
print(id(y))    # 140710087838136# 案例2:
l1 = [1, 2, 3]
l2 = l1  # 变量传递
l1[0] = 100
print(l1, l2)   # [100, 2, 3] [100, 2, 3]
l2[1] = 200
print(l1, l2)   # [100, 200, 3] [100, 200, 3]print(id(l1))   # 2031707148672
print(id(l2))   # 2031707148672# 案例3:
l1 = [1, 2, 3]
l2 = [l1, 4, 5]  # 也属于变量传递
l1[0] = 100
print(l1, l2)   # [100, 2, 3] [[100, 2, 3], 4, 5]
l2[0][1] = 200
print(l1, l2)   # [100, 200, 3] [[100, 200, 3], 4, 5]print(id(l1))   # 2003477188992
print(id(l2))   # 2003477190848

【4】列表的深浅拷贝

在Python中,列表的拷贝可以分为深拷贝和浅拷贝两种方式。

浅拷贝(Shallow Copy)创建一个新的列表对象,该对象与原始列表共享相同的元素对象。当你对其中一个列表进行修改时,另一个列表也会受到影响。

你可以使用以下方法进行浅拷贝:

# (1)使用切片操作符[:]进行拷贝:
l1 = [1, 2, 3, 4, 5]
l = l1[:]
print(l)    # [1, 2, 3, 4, 5]# (2)使用list()函数进行拷贝
l2 = [1, 2, 3, 4, 5]
l = list(l2)
print(l)    # [1, 2, 3, 4, 5]# (3)使用copy()方法进行拷贝(需要导入copy模块)
l3 = [1, 2, 3, 4, 5]
l = l3.copy()
print(l)    # [1, 2, 3, 4, 5]

场景应用:

# 案例1
l1 = [1, 2, 3]
l2 = l1[:]  # 浅拷贝print(l2)   # [1, 2, 3]
print(id(l1[0]))    # 140710087838136
print(id(l2[0]))    # 140710087838136
l1[1] = 300 
print(l1)   # [1, 300, 3]
print(l2)   # [1, 2, 3]# 案例2
l = [4, 5]
l1 = [1, 2, 3, l]
l2 = l1[:]l1[0] = 100
print(l2)   # [1, 2, 3, [4, 5]]
l1[3][0] = 400  
print(l2)   # [1, 2, 3, [400, 5]]
l1[3] = 400
print(l2)   # [1, 2, 3, [400, 5]]

深拷贝(Deep Copy)是创建一个新的列表对象,并且递归地复制原始列表中的所有元素对象。这意味着原始列表和深拷贝的列表是完全独立的,对其中一个列表的修改不会影响另一个列表。

你可以使用copy()模块中的deepcopy()函数进行深拷贝:

import copyoriginal_list = [1, 2, 3, 4, 5]
deep_copy = copy.deepcopy(original_list)print(original_list)    # [1, 2, 3, 4, 5]
print(deep_copy)        # [1, 2, 3, 4, 5]print(id(original_list))    # 2953231194304
print(id(deep_copy))        # 2953231192448

需要注意的是,深拷贝可能会更耗费内存和时间,特别是当拷贝的列表中包含大量嵌套的对象时。

相关文章:

  • React 状态管理:安全高效地修改对象属性的 3 种方法
  • Linux CPU利用率
  • 通往 AGI 的道路上,OpenAI 逐渐构建了全模态的工具集
  • 【算法优选】 动态规划之简单多状态dp问题——贰
  • OpenHarmony分布式软总线API调用测试工具 softbus_tool使用说明
  • 设计模式-接口隔离原则
  • CountDownLatch 详解
  • Java基础知识总结(48)
  • 106. 跑步锻炼(结果填空)
  • 蓝桥杯 2022 省 B 洛谷 P8787 砍竹子
  • Terminal常见快捷命令(持续更新)
  • 利用Leaflet + React:构建WEBGIS
  • 2024第十九届中国(温州)机械装备展9月20-22日举行
  • IDEA 宝贝插件
  • 靡语IT:Bootstrap 简介
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译]CSS 居中(Center)方法大合集
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • fetch 从初识到应用
  • Go 语言编译器的 //go: 详解
  • java第三方包学习之lombok
  • Java应用性能调优
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • python大佬养成计划----difflib模块
  • TCP拥塞控制
  • Tornado学习笔记(1)
  • TypeScript迭代器
  • Vultr 教程目录
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 实现菜单下拉伸展折叠效果demo
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​520就是要宠粉,你的心头书我买单
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #宝哥教你#查看jquery绑定的事件函数
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (10)ATF MMU转换表
  • (13):Silverlight 2 数据与通信之WebRequest
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • ***监测系统的构建(chkrootkit )
  • **CI中自动类加载的用法总结
  • ./configure,make,make install的作用(转)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 成都线下面基会拉开序幕
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net中ListT 泛型转成DataTable、DataSet
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • ??javascript里的变量问题
  • @Repository 注解
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用