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

奇怪的Python:为何字符串要设置成不可变的?

你好!我是老邓。今天我们来聊聊 Python 中字符串不可变这个话题。

1、问题简介:

Python 中,字符串属于不可变对象。这意味着一旦字符串被创建,它的值就无法被修改。任何看似修改字符串的操作,实际上都是创建了一个新的字符串。

2、假设我们要实现一个函数,将传入的字符串中的所有空格替换为下划线。

 
def replace_space(s):for i in range(len(s)):if s[i] == ' ':s[i] = '_'  #  尝试直接修改字符串中的字符return stest_str = "hello world"
new_str = replace_space(test_str)
print(new_str)

运行这段代码会报错 TypeError: 'str' object does not support item assignment 。这就是因为字符串是不可变的,我们不能像列表那样直接修改其中的字符。

3、原因和解决方案:

字符串的不可变性是由 Python 的底层实现决定的。这种设计带来了几个好处:

  • 哈希值稳定: 不可变性保证了字符串的哈希值是稳定的,因此字符串可以作为字典的键。

  • 线程安全: 多个线程可以安全地访问同一个字符串,无需担心数据竞争。

  • 内存优化: 在某些情况下,Python 可以对不可变字符串进行优化,例如字符串驻留 (string interning),从而减少内存占用。

要修改字符串,我们需要创建新的字符串。以下提供几种解决方案:

  • 使用字符串的内置方法: 例如 replace()、join() 等。

  • 切片和拼接: 通过切片获取字符串的各个部分,然后拼接成新的字符串。

  • 使用 `bytearray`: 如果需要频繁修改字符串内容,可以使用 bytearray 类型,它是一个可变的字节序列。

4、代码示例:

示例 1:使用 `replace()` 方法

 
def replace_space_with_replace(s):return s.replace(' ', '_')test_str = "hello world"
new_str = replace_space_with_replace(test_str)
print(new_str)  # 输出:hello_world

示例 2:使用切片和拼接

 
def replace_space_with_slice(s):new_s = ""for char in s:if char == ' ':new_s += '_'else:new_s += charreturn new_stest_str = "hello world"
new_str = replace_space_with_slice(test_str)
print(new_str)  # 输出:hello_world

示例 3:使用列表推导式和 `join()` 方法

 
def replace_space_with_join(s):return "".join(['_' if char == ' ' else char for char in s])test_str = "hello world"
new_str = replace_space_with_join(test_str)
print(new_str)  # 输出:hello_world

示例 4:使用 `bytearray` (适用于需要频繁修改的情况)

 
def replace_space_with_bytearray(s):b = bytearray(s, 'utf-8')for i in range(len(b)):if b[i] == ord(' '):b[i] = ord('_')return b.decode('utf-8')test_str = "hello world"
new_str = replace_space_with_bytearray(test_str)
print(new_str)  # 输出:hello_world

5、总结:

Python 字符串的不可变性是其语言设计的一部分,带来了性能和安全方面的优势。理解这一点对于编写高效、正确的 Python 代码至关重要。 

当需要修改字符串内容时,我们应该使用合适的方法创建新的字符串,而不是试图直接修改原字符串。

相关文章:

奇怪的Python:为何字符串要设置成不可变的?

你好!我是老邓。今天我们来聊聊 Python 中字符串不可变这个话题。 1、问题简介: Python 中,字符串属于不可变对象。这意味着一旦字符串被创建,它的值就无法被修改。任何看似修改字符串的操作,实际上都是创建了一个新…...

Vue-Router之嵌套路由

在路由配置中,配置children import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const router new VueRouter({mode: history,base: import.meta.env.BASE_URL,routes: [{path: /,redirect: /home},{path: /home,name: home,component: () &…...

MyBatis使用的设计模式

目录 1. 工厂模式(Factory Pattern) 2. 单例模式(Singleton Pattern) 3. 代理模式(Proxy Pattern) 4. 装饰器模式(Decorator Pattern) 5. 观察者模式(Observer Patt…...

arm rk3588 升级glibc2.31到2.33

一、查看glibc版本 rootztl:~# ldd --version ldd (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNE…...

【Linux系列】sed命令的深入解析:如何使用sed删除文件内容

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

C++ 设计模式:桥接模式(Bridge Pattern)

链接:C 设计模式 链接:C 设计模式 - 装饰模式 桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分(业务功能)与实现部分(平台实现)分离,使它们…...

MATLAB中whitespacePattern函数用法

目录 语法 说明 示例 匹配空白字符 替换非标准空白 更正错误的间距 whitespacePattern函数的功能是匹配空白字符。 语法 pat whitespacePattern pat whitespacePattern(N) pat whitespacePattern(minCharacters,maxCharacters) 说明 pat whitespacePattern 创建一…...

Django多字段认证的实现

Django多字段认证 需求: django认证的检查用户是username,如果使用 username和 手机号验证登录。 重写: ModelBackend 类下的 authenticate 方法 # 在对应应用下创建 utils.py""" 修改Django认证类,为了实现 …...

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更,Google 引入了更严格的 PendingIntent 安全管理,强制要求开发者明确指定 PendingIntent 的可变性(Mutable)或不可变性(Immutable)。 但是&#xf…...

SQL进阶技巧:如何分析连续签到领金币数问题?

目录 0 题目需求 1 数据准备 2 问题分析 2.1 代码实现 2.2 代码功能分析 第一段 SQL...

1、ELK的架构和安装

ELK简介 elk:elasticsearch logstash kibana,统一日志收集系统。 elasticsearch:分布式的全文索引引擎的非关系数据库,json格式,在elk中存储所有的日志信息,架构有主和从,最少需要2台。 …...

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…...

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘...

Android 系统 `android.app.Fragment` 类的深度定制与常见问题解析

Android 系统 android.app.Fragment 类的深度定制与常见问题解析 目录 引言Fragment 概述Fragment 的生命周期Fragment 的系统层深度定制 4.1 Fragment 的创建与初始化4.2 Fragment 的布局与视图4.3 Fragment 的通信机制4.4 Fragment 的动画与过渡4.5 Fragment 的状态保存与恢…...

linux ueditor nginx https 后台配置项返回格式出错,上传功能将不能正常使用

jsp的版本 如果出现了这个错误,上传的图标都亮起的情况,还是提示这个, 可以试试修改 uedtior.all.js 8082行 isJsonp utils.isCrossDomainUrl(configUrl); 改为 // isJsonp utils.isCrossDomainUrl(configUrl); isJsonp true; 如果还不…...

【机器学习 | 数据挖掘】时间序列算法

时间序列是按时间顺序排列的、随时间变化且相互关联的数据序列。分析时间序列的方法构成数据分析的一个重要领域,即时间序列分析。以下是对时间序列算法的详细介绍: 一、时间序列的分类 时间序列根据所研究的依据不同,可有不同的分类&#…...

uniapp H5 对接 声网,截图

文章目录 安装依赖创建容器容器样式 javascript代码ImageDataToBlob 方法 控制控制台LOG输出 安装依赖 版本"agora-rtc-sdk-ng": "^4.22.0", 创建容器 <template><view class"videoValue " id"videoValue"><u-toast…...

家谱管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库…...

【LeetCode】200、岛屿数量

【LeetCode】200、岛屿数量 文章目录 一、并查集1.1 并查集1.2 多语言解法 二、洪水填充 DFS2.1 洪水填充 DFS 一、并查集 1.1 并查集 // go var sets int var father [90000]intfunc numIslands(grid [][]byte) int {n, m : len(grid), len(grid[0])build(grid, n, m)for i …...

idea报错:There is not enough memory to perform the requested operation.

文章目录 一、问题描述二、先解决三、后原因&#xff08;了解&#xff09; 一、问题描述 就是在使用 IDEA 写代码时&#xff0c;IDEA 可能会弹一个窗&#xff0c;大概提示你目前使用的 IDEA 内存不足&#xff0c;其实就是提醒你 JVM 的内存不够了&#xff0c;需要重新分配。弹…...

Atmosphere:重新定义Nintendo Switch自制固件的革命性框架

Atmosphere&#xff1a;重新定义Nintendo Switch自制固件的革命性框架 【免费下载链接】Atmosphere Atmosphre is a work-in-progress customized firmware for the Nintendo Switch. 项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere 你是否曾想过&#x…...

YOLO12快速部署指南:Gradio界面已配好,启动就能用

YOLO12快速部署指南&#xff1a;Gradio界面已配好&#xff0c;启动就能用 1. 为什么选择YOLO12镜像 YOLO12作为2025年最新发布的目标检测模型&#xff0c;带来了革命性的注意力为中心架构。这个预配置好的镜像让您无需任何复杂操作&#xff0c;就能立即体验最先进的目标检测技…...

SQLite3嵌入式开发实战:从零构建一个轻量级学生管理系统(C语言版)

SQLite3嵌入式开发实战&#xff1a;从零构建一个轻量级学生管理系统&#xff08;C语言版&#xff09; 在嵌入式系统开发中&#xff0c;数据存储和管理一直是开发者需要面对的核心问题之一。传统文件系统虽然简单&#xff0c;但缺乏结构化查询能力&#xff1b;而大型数据库又过…...

MDS vs PCA:哪种降维方法更适合你的数据?

MDS与PCA深度对比&#xff1a;从算法原理到实战选型指南 当面对高维数据时&#xff0c;降维技术就像一把打开数据奥秘的钥匙。在众多降维方法中&#xff0c;多维尺度变换(MDS)和主成分分析(PCA)是最常被比较的两种经典技术。它们都能将复杂的高维数据简化为更易理解的二维或三维…...

终极空洞骑士模组管理器:用Scarab实现10倍效率提升的完整指南

终极空洞骑士模组管理器&#xff1a;用Scarab实现10倍效率提升的完整指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾经为《空洞骑士》安装模组时感到头疼&#x…...

Arduino串口乱码?波特率选9600还是115200?一次讲清串口通信的配置与避坑指南

Arduino串口通信终极指南&#xff1a;从波特率选择到实战避坑 当你第一次在Arduino串口监视器看到一堆乱码时&#xff0c;那种挫败感我深有体会。串口通信作为Arduino与外界对话的核心通道&#xff0c;其稳定性直接影响项目成败。本文将带你深入串口通信的底层逻辑&#xff0c…...

Llama-3.2V-11B-cot入门必看:Streamlit会话状态管理保障多用户隔离

Llama-3.2V-11B-cot入门必看&#xff1a;Streamlit会话状态管理保障多用户隔离 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡4090环境深度优化。该工具通过Streamlit框架构建了宽屏友好的交互界面…...

从Flatten到Hierarchy:数字IC后端工程师必须掌握的时序收敛技巧

从Flatten到Hierarchy&#xff1a;数字IC后端工程师必须掌握的时序收敛技巧 在22nm以下工艺节点&#xff0c;单芯片晶体管数量已突破10亿大关。面对如此庞大的设计规模&#xff0c;传统扁平化&#xff08;Flatten&#xff09;流程如同试图用绣花针建造摩天大楼——理论上可行&a…...

智慧农业 水稻害虫检测数据集 基于深度学习结合 深度学习模型(YOLOv11) 和 图形用户界面(GUI) 两部分来实现。 PyQt5

智慧化农业-水稻害虫目标检测数据集&#xff0c;3156张&#xff0c;yolo和voc两种标注方式 10类&#xff0c;标注数量&#xff1a; Asiatic Rice Borer: 亚洲稻螟 (716) Brown Plant Hopper: 褐飞虱 (577) Paddy Stem Maggot: 稻茎虫 (104) Rice Gall Midge: 稻瘿蚊 (223) Rice…...

【Typst源文件】Typst 纸张定义完全指南

Typst 通过 page 函数来定义纸张的尺寸、边距、方向等属性。通常使用 #set page() 规则在文档开头进行全局设置。 1. 基础纸张设置 1.1 使用标准纸张尺寸 Typst 支持丰富的标准纸张尺寸&#xff0c;只需传入纸张名称字符串即可&#xff1a; // 设置为 A4 纸张&#xff08;默…...