Python(六十九)为什么要将元组设计成不可变序列

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。
☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无论你是学生、职场人士还是对编程感兴趣的爱好者,都能从中受益。跟着我的学习笔记一起学习python吧。
🌙专栏目标:本专栏的目标是帮助我自己记忆、方便回顾所学知识以及帮助其他想学习python的小伙伴掌握Python编程语言的基本概念和技巧,并逐步提高我们的编程能力。通过这个专栏,我们将学会如何编写Python代码,理解各种数据类型、控制结构和函数,掌握常用的Python模块和库,以及应用Python解决实际问题。

⭐️ 专栏主要内容: 主要学习python的开发环境搭建;Python的基础知识,包括变量、数据类型、条件语句和循环等;python的数据结构和算法;python的函数和模块;python的文件处理等。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:从零开始的Python入门之路

在这里插入图片描述

Python提供了多种数据类型来满足不同的需求,其中之一就是元组(Tuple)。元组是一种不可变的有序序列,它在Python中具有重要的作用。

文章目录

    • 为什么要将元组设计成不可变序列
      • 1. 在多任务环境下,同时操作对象时不需要加锁
      • 2. 在程序中尽量使用不可变序列
    • 注意事项:元组中存储的是对象的引用
      • a. 如果元组中对象本身是不可变对象,则不能再引用其他对象
      • b. 如果元组中对象是可变对象,则可变对象的引用不允许改变,但数据可以改变

为什么要将元组设计成不可变序列

1. 在多任务环境下,同时操作对象时不需要加锁

在多任务环境中,多个任务可能同时访问和修改同一个数据。如果数据是可变的,那么在多任务同时修改数据时,就需要使用锁(Lock)来保证数据的一致性。而元组作为不可变序列,不会被修改,因此在多任务环境下,我们可以放心地同时访问元组对象,无需加锁。

示例代码:

import threading# 定义一个可变列表
my_list = [1, 2, 3]# 定义一个不可变元组
my_tuple = (1, 2, 3)# 定义一个函数,用于修改列表和元组
def modify_data():global my_list, my_tuplefor _ in range(1000000):my_list.append(4)# 元组不支持修改,下面的代码会抛出异常my_tuple += (4,)# 创建两个线程,同时修改数据
thread1 = threading.Thread(target=modify_data)
thread2 = threading.Thread(target=modify_data)# 启动线程
thread1.start()
thread2.start()# 等待线程执行完毕
thread1.join()
thread2.join()print("列表长度:", len(my_list))
print("元组长度:", len(my_tuple))

运行结果:

列表长度: 4000004
Traceback (most recent call last):File "example.py", line 18, in modify_datamy_tuple += (4,)
TypeError: 'tuple' object does not support item assignment

从运行结果可以看出,多个线程同时修改列表时,列表的长度会变得非常大,而多个线程同时修改元组时,会抛出异常。这说明元组的不可变性在多任务环境下起到了重要的作用。

2. 在程序中尽量使用不可变序列

在编写程序时,我们通常希望数据是安全的、不可变的。不可变序列具有以下优点:

  • 安全性:不可变序列可以保护数据的完整性,防止意外修改数据。
  • 可散列性:不可变序列可以作为字典(Dictionary)的键值,因为字典要求键值必须是可散列的(Hashable)。
  • 性能优化:不可变序列在创建后不可修改,因此可以进行一些优化,例如缓存计算结果,提高程序的执行效率。

示例代码:

# 使用可变列表
my_list = [1, 2, 3]
my_list.append(4)
print(my_list)  # 输出:[1, 2, 3, 4]# 使用不可变元组
my_tuple = (1, 2, 3)
# 元组不支持修改,下面的代码会抛出异常
my_tuple.append(4)
print(my_tuple)

运行结果:

[1, 2, 3, 4]
AttributeError: 'tuple' object has no attribute 'append'

从运行结果可以看出,使用列表可以方便地修改数据,而使用元组则无法修改数据。因此,在程序中,如果我们希望数据是不可变的,就应该使用元组。

注意事项:元组中存储的是对象的引用

在使用元组时,需要注意元组中存储的是对象的引用,而不是对象本身。这意味着元组中的元素可以是任何对象,无论是不可变对象还是可变对象。

a. 如果元组中对象本身是不可变对象,则不能再引用其他对象

示例代码:

# 定义一个元组,包含一个整数和一个字符串
my_tuple = (1, "hello")# 尝试修改元组中的整数
my_tuple[0] = 2  # 抛出异常:TypeError: 'tuple' object does not support item assignment# 尝试修改元组中的字符串
my_tuple[1] += " world"  # 抛出异常:TypeError: 'tuple' object does not support item assignmentprint(my_tuple)

运行结果:

Traceback (most recent call last):File "example.py", line 5, in <module>my_tuple[0] = 2
TypeError: 'tuple' object does not support item assignment

从运行结果可以看出,尝试修改元组中的整数和字符串都会抛出异常。这是因为整数和字符串都是不可变对象,它们的值无法修改。

b. 如果元组中对象是可变对象,则可变对象的引用不允许改变,但数据可以改变

示例代码:

# 定义一个元组,包含一个列表
my_tuple = ([1, 2, 3],)# 尝试修改元组中的列表
my_tuple[0].append(4)print(my_tuple)  # 输出:([1, 2, 3, 4],)

运行结果:

([1, 2, 3, 4],)

从运行结果可以看出,尽管元组中的列表是可变对象,我们可以修改列表中的数据,但是不能修改列表的引用。这就意味着我们可以向列表中添加、删除元素,但不能将列表替换为另一个列表。

参考链接:

  • Python官方文档 - 元组 (tuple)
  • Python官方文档 - 锁 (Lock)
  • Python官方文档 - 可散列类型 (Hashable)

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

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

相关文章

nginx服务

目录 基本介绍 nginx的主要功能 nginx的主要应用场景 nginx常用命令 nginx另外一种安装方式 nginx常用的信号符&#xff1a; nginx配置文件详解 全局配置 event模块 http模块 server模块 location模块&#xff1a; 模块的划分 基本介绍 nginx&#xff1a;高性能、…

06 Ubuntu22.04上的miniconda3安装、深度学习常用环境配置

下载脚本 我依然是在清华镜像当中寻找的脚本。这里找脚本真的十分方便&#xff0c;我十分推荐。 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh 下载十分快速&#xff0c;10秒解决问题 运行miniconda3安装脚本 赋予执…

python数据容器

目录 数据容器 反向索引 list列表 语法 案例 列表的特点 列表的下表索引 list的常用操作 list列表的遍历 while循环遍历 for循环遍历 tuple元组 前言 元组定义 元组特点 获取元组元素 元组的相关操作 元组的遍历 while循环遍历 for循环遍历 字符串 前言…

LeetCode113. 路径总和 II

113. 路径总和 II 文章目录 [113. 路径总和 II](https://leetcode.cn/problems/path-sum-ii/)一、题目二、题解方法一&#xff1a;递归另一种递归版本方法二&#xff1a;迭代 一、题目 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶…

java+python企业会议在线办公微信小程序 ia505

一、小程序端功能 该部分内容提供员工注册、员工资料修改、通知公告、部门信息、会议记录等等功能。 二、管理员管理功能 该部分内容包含了首页、个人中心、通知公告管理、员工管理、部门信息管理、职位信息管理、会议记录管理、待办事项管理、工资信息管理、留言板管理、系统管…

C++ 类型兼容规则

类型兼容规则是指在需要基类对象的任何地方&#xff0c;都可以使用公有派生类的对象来替代。 通过公有继承&#xff0c;派生类得到了基类中除构造函数和析构函数之外的所有成员。这样&#xff0c;公有派生类实际就具备了基类的所有功能&#xff0c;凡是基类能解决的问题&#x…

微信支付官方文档怎么看

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Cilium系列-14-Cilium NetworkPolicy 简介

系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 介绍 Kubernetes 网络策略以及 CiliumNetworkPolicies 额外支持的内容。 网络策略(NetworkPolicy)的类型 默认情况下&#xff0c;Kubernetes 集群中的所有 pod 都可被其他 pod 和网络端点访问。 网络策…

Kafka3.0.0版本——Broker(Zookeeper服务端存储的Kafka相关信息)

目录 一、启动zookeeper集群及kafka集群服务启动1.1、先启动三台zookeeper集群服务&#xff0c;再启动三台kafka集群服务1.2、使用PrettyZoo连接zookeeper客户端工具 二、在zookeeper服务端存储的Kafka相关信息 一、启动zookeeper集群及kafka集群服务启动 1.1、先启动三台zook…

计算机成下一个土木了吗?

前些年抓住了互联网行业的红利期&#xff0c;进入大厂的员工&#xff0c;基本可以实现在一线城市买房扎根。 但反观现在&#xff0c;“被毕业、逃离互联网、躺平算了...”却成了这个行业的主旋律&#xff0c;不少人在谈论润到国企和外企去了&#xff0c;也放低了对工资的预期&…

LIME(可解释性分析方法)

目录 1.什么是LIME 2.思路 3.LIME在不同任务中的范式&#xff08;待补充&#xff09; 1.什么是LIME 简单理解&#xff1a; 对于分类任务&#xff1a;如下图所示&#xff0c;LIME可以列出分类结果&#xff0c;所依据特征对应给比重。 对于图像分类任务&#xff1a;如下图所示&a…

docker 配置 Mysql主从集群

Docker version 20.10.17, build 100c701 MySQL Image version: 8.0.32 Docker container mysql-master is source. mys ql-replica is replication. master source. replica slave.名称叫法不一样而已。 Choose one of the way&#xff0c;与replica同步数据两种情况&…

【Shell】基础语法(一)

文章目录 一、shell的介绍二、执行脚本三、shell的基本语法1. 变量的使用2. 变量的分类 一、shell的介绍 Shell的作用是解释执行用户的命令&#xff0c;用户输入一条命令&#xff0c;Shell就解释执行一条&#xff0c;这种方式称为交互式&#xff08;Interactive&#xff09;&a…

不规则文件转JSON

需求分析&#xff1a; 有时候&#xff0c;我们取出来的数据并不是一个规则的JSON文件&#xff0c;这个时候面对存库还是ES检索都是一个问题&#xff0c;所以我们就需要进行解析&#xff0c;然而用字符串分割是不现实的&#xff0c;我们需要一种快速的方法。 问题解决&#x…

Linux-centos花生壳实现内网穿透

Linux-centos花生壳实现内网穿透 官网教程 1.安装花生壳 下载网址 点击复制就可以复制下载命令了 wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm" -O phddns_5.2.0_amd64.rpm# 下载完成之后会多一个rpm文件 [rootlocalhost HuaSheng]# ls phddns_…

flask中的应用上下文

flask中的应用上下文 Flask应用上下文主要包含两个对象&#xff1a;current_app和g。这两个对象在处理请求期间都是全局可访问的&#xff0c;但在每个请求结束时都会被重置。 current_app&#xff1a;这是当前激活的Flask应用的实例。在大多数情况下&#xff0c;你可以将其视为…

刷题DAY16

题目一 给定两个字符串str1和str2&#xff0c;再给定三个整数ic、dc和rc&#xff0c;分别代表插入、删除和替换一个字符的代价&#xff0c;返回将str1编辑成str2的最小代价。【举例]str1"abc",str2“adc",ic5,dc3,rc2从“abc“编辑成adc",把b替换成d是代价…

zookeeper --- 高级篇

一、zookeeper 事件监听机制 1.1、watcher概念 zookeeper提供了数据的发布/订阅功能&#xff0c;多个订阅者可同时监听某一特定主题对象&#xff0c;当该主题对象的自身状态发生变化时(例如节点内容改变、节点下的子节点列表改变等)&#xff0c;会实时、主动通知所有订阅者 …

epoll、poll、select的原理和区别

select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制&#xff0c;一个进程可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读写操作。但select&a…

Markdown学习简记

目录 一、写Markdown的第0步 二、语法须知 标题 粗体强调 斜体 斜体同时粗体 删除线 高亮 代码 代码块 引用块 无序列表 有序列表 链接 表格 图片 分割线 目录生成 内联HTML代码 Typora常用快捷键 Typora的主题样式与检查元素 一、写Markdown的第…