Python中的可变对象与不可变对象;Python中的六大标准数据类型哪些属于可变对象,哪些属于不可变对象

Python中的可变对象与不可变对象;Python中的六大标准数据类型哪些属于可变对象,哪些属于不可变对象

  • Python中的可变对象与不可变对象
    • 一、Python的六大标准数据类型
      • 1. 数字类型 (Number)
      • 2. 字符串 (String)
      • 3. 列表 (List)
      • 4. 元组 (Tuple)
      • 5. 集合 (Set)
      • 6. 字典 (Dictionary)
    • 二、可变对象与不可变对象的内存地址变化
      • 1. 不可变对象的内存地址
      • 2. 可变对象的内存地址
      • 3. 示例代码
    • 三、总结

Python中的可变对象与不可变对象

在Python中,数据类型分为可变对象和不可变对象,它们在内存中的表现方式有所不同,特别是在进行数据修改时,是否会影响对象的内存地址。本文将通过Python中的六大标准数据类型(数字、字符串、列表、元组、集合、字典)来分析哪些属于可变对象,哪些属于不可变对象。

一、Python的六大标准数据类型

Python中有六大标准数据类型:

  • 数字 (Number): int, float, bool, complex
  • 字符串 (String): str
  • 列表 (List): list
  • 元组 (Tuple): tuple
  • 集合 (Set): set
  • 字典 (Dictionary): dict

1. 数字类型 (Number)

数字类型包括整数 int、浮点数 float、布尔值 bool 和复数 complex。这些类型的对象是不可变的。

2. 字符串 (String)

字符串类型 (str) 是不可变对象。这意味着字符串对象的内容一旦创建就不能改变。

3. 列表 (List)

列表类型 (list) 是可变对象。对列表的任何修改都会直接影响到原始列表对象。

4. 元组 (Tuple)

元组类型 (tuple) 是不可变对象。尽管元组本身是一个容器,它不能修改,但它可以包含可变类型的元素。

5. 集合 (Set)

集合类型 (set) 是可变对象。你可以在原有集合中添加或删除元素。

6. 字典 (Dictionary)

字典类型 (dict) 也是可变对象。你可以直接修改字典中的键值对。

二、可变对象与不可变对象的内存地址变化

1. 不可变对象的内存地址

不可变对象的内存地址在修改时会发生变化,每次修改都会创建新的对象,原始对象的内存地址保持不变。在实际应用中,尽量使用不可变对象。如tuple,是不可变对象,代码会安全。
在这里插入图片描述

2. 可变对象的内存地址

可变对象的内存地址不会改变,对对象内容的修改会直接影响原始对象。多个引用会指向同一个内存地址。
在这里插入图片描述

3. 示例代码

# 1. 数字类型(不可变)
a = 10
b = a
print("数字类型示例:")
print(f"初始值: a = {a}, b = {b}")
print(f"初始地址: id(a) = {id(a)}, id(b) = {id(b)}")  # 初始时a和b地址相同

# 对不可变对象进行变更操作
a += 5  # 改变a的值
print(f"\n修改后的值: a = {a}, b = {b}")
print(f"修改后的地址: id(a) = {id(a)}, id(b) = {id(b)}")  # a的地址发生变化,b的地址不变

# 2. 字符串类型(不可变)
s1 = "hello"
s2 = s1
print("\n字符串类型示例:")
print(f"初始值: s1 = {s1}, s2 = {s2}")
print(f"初始地址: id(s1) = {id(s1)}, id(s2) = {id(s2)}")  # 初始时s1和s2地址相同

# 对不可变对象进行变更操作
s1 = "world"  # 重新赋值
print(f"\n修改后的值: s1 = {s1}, s2 = {s2}")
print(f"修改后的地址: id(s1) = {id(s1)}, id(s2) = {id(s2)}")  # s1的地址发生变化,s2的地址不变

# 3. 列表类型(可变)
lst1 = [1, 2, 3]
lst2 = lst1
print("\n列表类型示例:")
print(f"初始值: lst1 = {lst1}, lst2 = {lst2}")
print(f"初始地址: id(lst1) = {id(lst1)}, id(lst2) = {id(lst2)}")  # 初始时lst1和lst2地址相同

# 对可变对象进行变更操作
lst1.append(4)  # 直接修改列表
print(f"\n修改后的值: lst1 = {lst1}, lst2 = {lst2}")
print(f"修改后的地址: id(lst1) = {id(lst1)}, id(lst2) = {id(lst2)}")  # 地址不变,因为它们共享同一个对象

# 4. 元组类型(不可变)
t1 = (1, 2, 3)
t2 = t1
print("\n元组类型示例:")
print(f"初始值: t1 = {t1}, t2 = {t2}")
print(f"初始地址: id(t1) = {id(t1)}, id(t2) = {id(t2)}")  # 初始时t1和t2地址相同

# 对不可变对象进行变更操作
t1 = (4, 5, 6)  # 重新赋值
print(f"\n修改后的值: t1 = {t1}, t2 = {t2}")
print(f"修改后的地址: id(t1) = {id(t1)}, id(t2) = {id(t2)}")  # t1的地址发生变化,t2的地址不变

# 5. 集合类型(可变)
s1 = {1, 2, 3}
s2 = s1
print("\n集合类型示例:")
print(f"初始值: s1 = {s1}, s2 = {s2}")
print(f"初始地址: id(s1) = {id(s1)}, id(s2) = {id(s2)}")  # 初始时s1和s2地址相同

# 对可变对象进行变更操作
s1.add(4)  # 修改集合
print(f"\n修改后的值: s1 = {s1}, s2 = {s2}")
print(f"修改后的地址: id(s1) = {id(s1)}, id(s2) = {id(s2)}")  # 地址不变,因为它们共享同一个集合对象

# 6. 字典类型(可变)
d1 = {"a": 1, "b": 2}
d2 = d1
print("\n字典类型示例:")
print(f"初始值: d1 = {d1}, d2 = {d2}")
print(f"初始地址: id(d1) = {id(d1)}, id(d2) = {id(d2)}")  # 初始时d1和d2地址相同

# 对可变对象进行变更操作
d1["c"] = 3  # 修改字典
print(f"\n修改后的值: d1 = {d1}, d2 = {d2}")
print(f"修改后的地址: id(d1) = {id(d1)}, id(d2) = {id(d2)}")  # 地址不变,因为它们共享同一个字典对象

输出示例:

数字类型示例:
初始值: a = 10, b = 10
初始地址: id(a) = 140732924626120, id(b) = 140732924626120

修改后的值: a = 15, b = 10
修改后的地址: id(a) = 140732924626280, id(b) = 140732924626120

字符串类型示例:
初始值: s1 = hello, s2 = hello
初始地址: id(s1) = 1593406727024, id(s2) = 1593406727024

修改后的值: s1 = world, s2 = hello
修改后的地址: id(s1) = 1593406727984, id(s2) = 1593406727024

列表类型示例:
初始值: lst1 = [1, 2, 3], lst2 = [1, 2, 3]
初始地址: id(lst1) = 1593403419712, id(lst2) = 1593403419712

修改后的值: lst1 = [1, 2, 3, 4], lst2 = [1, 2, 3, 4]
修改后的地址: id(lst1) = 1593403419712, id(lst2) = 1593403419712

元组类型示例:
初始值: t1 = (1, 2, 3), t2 = (1, 2, 3)
初始地址: id(t1) = 1593406881728, id(t2) = 1593406881728

修改后的值: t1 = (4, 5, 6), t2 = (1, 2, 3)
修改后的地址: id(t1) = 1593406305152, id(t2) = 1593406881728

集合类型示例:
初始值: s1 = {1, 2, 3}, s2 = {1, 2, 3}
初始地址: id(s1) = 1593404393728, id(s2) = 1593404393728

修改后的值: s1 = {1, 2, 3, 4}, s2 = {1, 2, 3, 4}
修改后的地址: id(s1) = 1593404393728, id(s2) = 1593404393728

字典类型示例:
初始值: d1 = {'a': 1, 'b': 2}, d2 = {'a': 1, 'b': 2}
初始地址: id(d1) = 1593404749504, id(d2) = 1593404749504

修改后的值: d1 = {'a': 1, 'b': 2, 'c': 3}, d2 = {'a': 1, 'b': 2, 'c': 3}
修改后的地址: id(d1) = 1593404749504, id(d2) = 1593404749504

三、总结

  • 不可变对象: 数字类型(intfloatboolcomplex)、字符串 (str)、元组 (tuple)
  • 可变对象: 列表 (list)、集合 (set)、字典 (dict)

理解可变与不可变对象的区别对编写高效且没有bug的代码非常重要。在开发过程中,使用不可变对象可以避免意外修改数据,而使用可变对象则能够有效管理数据的动态变化。

希望本文对你理解Python中的对象变更和内存管理有所帮助。如果你有任何问题或补充,欢迎在评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js状态模式

允许一个对象在其内部状态改变时改变它的行为。 状态模式将对象的状态封装成独立的类,并使它们可以互相转换 // 定义状态接口class State {constructor() {if (this.constructor State) {throw new Error(不能实例化抽象类);}}// 定义状态方法handle(context) {th…

基于64QAM的载波同步和定时同步性能仿真,包括Costas环和gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…

【Web安全】SQL 注入攻击技巧详解:布尔盲注(Boolean-Based Blind SQL Injection)

【Web安全】SQL 注入攻击技巧详解:布尔盲注(Boolean-Based Blind SQL Injection) 引言 布尔盲注(Boolean-Based Blind SQL Injection)是一种在无法直接从数据库获取数据的情况下,通过观察数据库响应的布尔…

太速科技-418-基于AD9361 +ZYNQ7020 的软件无线电 SDR 套件

基于AD9361 ZYNQ7020 的软件无线电 SDR 套件 一、板卡信息 ● ZYNQ芯片采用XC7Z020,逻辑容量更大,支持更大的逻辑设计; ● 内存采用两片512M DDR3,共1GByte,更大容量。 ● 支持千兆网口,支持ZEDFMCO…

SpringBoot日常:集成Kafka

文章目录 1、pom.xml文件2、application.yml3、生产者配置类4、消费者配置类5、消息订阅6、生产者发送消息7、测试发送消息 本章内容主要介绍如何在springboot项目对kafka进行整合,最终能达到的效果就是能够在项目中通过配置相关的kafka配置,就能进行消息…

分布式IO模块:激光切割机产线高效控制的创新引擎

在智能制造的浪潮中,激光切割技术以其高精度、高效率的特点,成为了现代工业生产中不可或缺的一部分。特别是在汽车制造、航空航天、电子设备及精密零部件加工等领域,激光切割机以其无与伦比的切割精度和灵活性,引领着制造业的转型…

RK3562编译Android13 ROOT固件教程,触觉智能开发板演示

本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。 关闭seli…

wireshark抓包工具新手使用教程

wireshark抓包工具新手入门使用教程 一、Wireshark软件安装二、Wireshark 抓包示范三、Wireshakr抓包界面四、Wireshark过滤器设置五、wireshark过滤器表达式的规则六、Wireshark抓包分析TCP三次握手七、Wireshark分析常用列标签格式 Wireshark是一款开源的网络协议分析工具&am…

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错,而 XML 格式发票因其结构化、标准化的特点,为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据:XML 格式发票…

【网络安全 | 漏洞挖掘】HubSpot 全账户接管(万字详析)

未经许可,不得转载。 今天我们将分享一个关于在 Bugcrowd 平台的 HubSpot 公共漏洞赏金计划中实现全账户接管的故事。 文章目录 正文SQL 注入主机头污染(Host Header Poisoning)负载均衡器主机头覆盖(Load Balancer Host Header Override)Referer Header 测试ORIGIN Heade…

2025_0105_生活记录

3号去内蒙看了流星雨。还记得上次看流星的时间是2018年,也是冬天,大家在雁栖湖校区的操场上仰望星空。那个时候幸运的看到了一颗流星,便迅速地在心里许愿。这次看到了三颗流星,我也许了愿,希望实现。 24年走过了十多个…

(四)ROS通信编程——服务通信

前言 学完了话题通信其实操作流程基本都已经很熟悉了,因此服务通讯的学习就会流畅许多。 服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收…

《繁星路》V1.8.3(Build16632266)官方中文学习版

《繁星路》官方中文版https://pan.xunlei.com/s/VODae2_2Z3QyMF02I5y321uHA1?pwdqgsh# 作为一款星际模拟游戏,完美融合了硬科幻元素与基地建设玩法,体验改造行星的恢弘与壮阔。化身人工意识AMI,遵照基本指示推进火星改造的各项工作&#xf…

学习threejs,导入wrl格式的模型

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.VRMLLoader wrl模型加…

Element-plus、Element-ui之Tree 树形控件回显Bug问题。

需求&#xff1a;提交时&#xff0c;需要把选中状态和半选中状态 的数据id提交。如图所示&#xff1a; 数据回显时&#xff0c;会出现代码如下&#xff1a; <template><el-tree ref"treeRef" :data"data" show-checkbox node-key"id" …

专家混合(MoE)大语言模型:免费的嵌入模型新宠

专家混合&#xff08;MoE&#xff09;大语言模型&#xff1a;免费的嵌入模型新宠 今天&#xff0c;我们深入探讨一种备受瞩目的架构——专家混合&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;大语言模型&#xff0c;它在嵌入模型领域展现出了独特的魅力。 一、M…

cursor试用出现:Too many free trial accounts used on this machine 的解决方法

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

若依 ruoyi-vue HandlerInterceptor 拦截器 文件接口自定义权限

文件资源添加自定义权限 package com.huida.framework.config;import com.huida.framework.interceptor.FileInterceptor; import com.huida.framework.interceptor.RequestInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springfr…

网络安全-web渗透环境搭建-BWAPP(基础篇)

01--所需系统环境&#xff1a; 虚拟主机系统部署&#xff08;vmware&#xff0c;虚拟主机创建、虚拟主机网络配置&#xff08;桥接&#xff0c;便于网络中多个主机都能访问虚拟主机&#xff09;、虚拟软件功能&#xff0c;快照、克隆、镜像文件加载&#xff0c;ova文件制作&am…

【计算机网络】课程 实验四 配置快速生成树协议(RSTP)

实验四 配置快速生成树协议&#xff08;RSTP&#xff09; 一、实验目的 1&#xff0e;理解快速生成树协议RSTP的工作原理。 2&#xff0e;掌握如何在交换机上配置快速生成树。 二、实验分析与设计 【背景描述】 某学校为了开展计算机教学和网络办公&#xff0c;建立了一个计…