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

news2024/11/18 2:32:19

【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 copy

original_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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二极管分类及用途

二极管分类及用途 通用开关二极管 特点:电流小,工作频率高 选型依据:正向电流、正向压降、功耗,反向最大电压,反向恢复时间,封装等 类型:BAS316 ; IN4148WS 应用电路: 说明:应用…

单路高清HDMI编码器JR-3211HD

产品简介: JR-3211HD单路高清HDMI编码器是专业的高清音视频编码产品,该产品具有支持1路高清HDMI音视频采集功能, 1路3.5MM独立外接音频输入,编码输出双码流H.264格式,音频MP3/AAC格式。编码码率可调,画面质…

双写一致性问题

双写一致性问题:同一份数据,需要写数据库、写缓存。数据库中的数据和缓存中的数据要一致 解决办法:延迟双删 当我们要进行更新操作时,先删除缓存,再更新数据库,延迟几百ms再删除一次redis的缓存数据。 示…

Java-Scanner类进阶+题目

Scanner进阶 接收整数数据时: 接收小数数据时: 例子: 可以先这样弄出scanner的框架: 未完待续... ...

DDoS攻击包含哪些层面?如何防护?

DDoS攻击(分布式拒绝服务攻击)是一种通过向目标服务器发送大量流量或请求,以使其无法正常工作的网络攻击手段。DDoS攻击涉及多个层面,在实施攻击时对网络基础架构、网络协议、应用层等进行攻击。下面将详细介绍DDoS攻击的层面。 1…

L1-027 出租

下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。 本…

【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~

Git教程 版本标签(tag) 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交🌾 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …

5.3 mybatis之autoMappingUnknownColumnBehavior作用

文章目录 1. NONE2. WARNING3. FAILING autoMappingUnknownColumnBehavior是< settings >配置下的属性&#xff0c;该属性是指定发现自动映射目标未知列&#xff08;或未知属性类型&#xff09;的行为。就是说当数据库中的字段找不到映射java对象的属性或者与java对象对应…

1036: 寻找整数序列的主元素

解法&#xff1a; #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {int n;cin >> n;vector<int> arr(n);vector<int> tong(1000);for (auto& x : arr) {cin >> x;tong[x];}int pma…

ArrayList底层源码分析

ArrayList底层源码分析 底层原理 创建使用ArrayList<>()创建空对象的时候&#xff0c;会在底层创建一个长度为0的数组。该数组的名称为elementData&#xff0c;定义变量size size变量有两层含义 ① 表示元素的个数&#xff0c;也就是集合的长度② 表示下一个元素的存入位…

PostgreSQL入门到实战-第二十九弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(四)官网地址PostgreSQL概述PostgreSQL中CUBE命令理论PostgreSQL中CUBE命令实战更新计划 PostgreSQL中数据分组操作(四) 如何使用PostgreSQL CUBE生成多个分组集 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不…

Ubuntu20.04安装FloodLight最新版本

Ubuntu20.04安装FloodLight最新版本 网上的很多教程尝试了一下都不对&#xff0c;并且很多都是基于Ubuntu14的旧版本系统&#xff0c;其中的Python环境大多是基于2.0的&#xff0c;由于本人所使用的系统是Ubuntu20.04&#xff0c;后再油管澳大利亚某个学校的网络教学视频的帮助…

全国各省自然灾害损失造成的直接经济损失数据(2009-2022年)

01、数据简介 自然灾害是指给人类生存带来危害或损害人类生活环境的自然现象&#xff0c;这些现象是地球演化过程的自然现象。它们主要包括气象灾害、地质灾害、海洋灾害、生物灾害、森林草原火灾等五大类。 具体来说&#xff0c;气象灾害包括干旱、洪涝灾害、台风、风雹、低…

【OpenHarmony】XTS环境配置

零、参考 1、xts测试环境配置&#xff1a;https://www.yuque.com/u25440504/ehvzki/ik2fso 2、Windows安装Python、pip、easy_install的方法&#xff1a;https://pythonjishu.com/bmxqeisbkzgrpnn/ 3、Python中easy_install 和 pip 的安装及使用&#xff1a; https://blog.c…

【2024年IT行业各方向学习路线图(必收藏】

【IT行业各方向学习路线图(必收藏】 2024 Java学习路线图&#xff1a; 学习Java基础知识&#xff0c;包括语法、数据类型、控制流程等。 掌握面向对象编程&#xff08;OOP&#xff09;的概念和Java中的实现。 熟悉Java集合框架和多线程编程。 学习Java I/O流、网络编程和数据…

2024HW --> 安全产品 Powershell无文件落地攻击

在HW中&#xff0c;除了了解中间件&#xff0c;web漏洞&#xff0c;这些攻击的手法&#xff0c;还得了解应急响应&#xff0c;安全产品&#xff0c;入侵排查&#xff0c;溯源反制...... 那么今天&#xff0c;就来说一下安全产品&#xff08;安全公司我就不说了&#xff0c;这个…

[linux]进程控制——进程创建

一、fork&#xff1a; 在linux中fork函数从已存在进程中&#xff0c;创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1。 1、常规用法&#xff1a; 一个父进程希望复制…

【THM】Net Sec Challenge(网络安全挑战)-初级渗透测试

介绍 使用此挑战来测试您对网络安全模块中获得的技能的掌握程度。此挑战中的所有问题都可以仅使用nmap、telnet和来解决hydra。 挑战问题 您可以使用Nmap、 Telnet 和Hydra回答以下问题。 2.1小于10000的最大开放端口号是多少? 8080 nmap -p- -T4 10.10.234.218 2.2普通…

43岁百亿千金夫妇国外旅游高调放闪,羡煞好友马国明

萧正楠早前忙着拍摄TVB新剧《奔跑吧&#xff01;勇敢的女人们》&#xff0c;剧集煞科后他即和老婆黄翠如一起到意大利旅行。两公婆分别在IG大晒旅行靓相&#xff0c;甜蜜满泻。 这次萧正楠的旅游照都是由翠如亲自操刀拍摄&#xff0c;相中所见&#xff0c;萧正楠在广场大摆Chok…

个人笔记目录

目录 一、lora 微调 alpaca 笔记 二、全量微调 Llama2-7b笔记 三、Huggingface trainer 与 from_pretrained简单介绍&#xff08;笔记&#xff09; 四、vscode调试launch.json常用格式 五、huggingface generate函数简介 六、Trl: llama2-7b-hf使用QLora 4bit量化后ds zer…