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循环遍历 字符串 前言…

SpringBoot复习:(19)Condition接口和@Conditional注解

Condition接口代码如下&#xff1a; public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}它是一个函数式接口&#xff0c;只有一个方法matches用来表示条件是否满足。matches方法中的ConditionContext类对象context可以…

OPENCV C++(五)滤波函数+sobel边缘检测+人脸磨皮mask

滤波函数 中值滤波 medianBlur(frame, detectmat, 5); 平均滤波 blur(frame, detectmat, Size(5, 5)); 高斯滤波&#xff08;最后一个是方差 越大越模糊&#xff09; GaussianBlur(frame, detectmat, Size(5, 5),0); sobel的边缘检测函数 Sobel(gray, dx, CV_16S, 1, 0, 3…

图片静态展示

图片静态展示程序&#xff0c;包含选择文件夹路径&#xff0c;旋转&#xff0c;放大缩小&#xff0c;拖动&#xff0c;幻灯片播放&#xff0c;上一张下一张等&#xff0c;程序使用QT实现。 程序下载地址&#xff1a; 图片静态展示&#xff0c;包含选择文件夹路径&#xff0c;…

LeetCode113. 路径总和 II

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

Golang之路---04 项目管理——编码规范

本文根据个人编码习惯以及网络上的一些文章&#xff0c;整理了一些大家能用上的编码规范&#xff0c;可能是一些主流方案&#xff0c;但不代表官方。 1. 文件命名 由于 Windows平台文件名不区分大小写&#xff0c;所以文件名应一律使用小写 不同单词之间用下划线分词&#xf…

第20周 服务容错-Hystrix

RabbitMQ 安装 1. 首先在Linux上进行一些软件的准备工作&#xff0c;yum下来一些基础的软件包 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel 2. 下载RabbitMQ所需软件包&#xff08;本神在这里使用的是 RabbitM…

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

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

二叉树的直径 LeetCode热题100

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 思路 分析二叉树的直径&#xff0c;无非是一个节点加上…

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…