python可变对象与不可变对象

文章目录

  • Python 中的可变对象与不可变对象
    • 不可变对象(Immutable Objects)
    • 可变对象(Mutable Objects)
    • 重要区别

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

在 Python 中,对象可以分为可变对象(mutable)和不可变对象(immutable),这是 Python 中非常重要的概念,影响着对象的赋值、传递和修改行为。

不可变对象(Immutable Objects)

不可变对象是指创建后不能被修改的对象。如果尝试修改,实际上是创建了一个新对象。

常见的不可变类型

  • 数字类型:int, float, bool
  • 字符串:str
  • 元组:tuple
  • 冻结集合:frozenset

示例

# 整数是不可变的
x = 10
print(id(x))  # 打印内存地址
x += 1
print(id(x))  # 内存地址改变,是新对象# 字符串是不可变的
s = "hello"
print(id(s))
s += " world"
print(id(s))  # 新字符串对象# 元组是不可变的
t = (1, 2, 3)
try:t[0] = 100  # 尝试修改元组的第一个元素
except TypeError as e:print(e)  # 输出错误信息(TypeError)

特别注意:

尽管元组本身是不可变的,但如果元组中包含可变对象,如列表,这些可变对象内部的内容是可以被修改的。这种情况下,元组的不可变性只适用于顶层结构,不影响内部元素的可变性。

tup = (1, [2, 3], 4)
tup[1].append(5)  # 修改元组中的列表
print(tup)  # 输出 (1, [2, 3, 5], 4)

可变对象(Mutable Objects)

可变对象是指创建后可以被修改的对象,修改时内存地址不变。

常见的可变类型

  • 列表:list
  • 字典:dict
  • 集合:set
  • 字节数组:bytearray
  • 用户自定义的类实例

示例

# 列表是可变的
lst = [1, 2, 3]
print(id(lst))  # 打印内存地址
lst.append(4)
print(id(lst))  # 内存地址不变# 字典是可变的
d = {'a': 1}
print(id(d))
d['b'] = 2
print(id(d))  # 内存地址不变# 集合是可变的
st = {1, 2, 3}
print(id(st))
st.add(4)
st.remove(3)
print(id(st))

重要区别

  1. 赋值与修改

    # 不可变对象
    a = 1
    b = a
    b = 2  # a不变# 可变对象
    x = [1, 2]
    y = x
    y.append(3)  # x也被修改
    
  2. 函数参数传递

    • 不可变对象作为参数时,函数内修改不会影响原值
    • 可变对象作为参数时,函数内修改会影响原值
    def modify(num, lst):num += 1lst.append(4)n = 10
    l = [1, 2, 3]
    modify(n, l)
    print(n)  # 输出10,不变
    print(l)  # 输出[1, 2, 3, 4],被修改
    
  3. 字典键的限制

    • 只有不可变对象可以作为字典的键
    • 可变对象不能作为字典的键
    d = {}
    d['key'] = 'value'  # 字符串键,合法
    d[1] = 'number'     # 整数键,合法
    d[(1, 2)] = 'tuple' # 元组键,合法# d[[1, 2]] = 'list'  # 报错,列表不能作为键
    
  4. 集合元素的限制
    尽管集合是可变的,但也有一些操作上的限制。例如,集合只能包含不可变(可哈希)的对象。因此不能将列表或另一个集合作为元素添加到集合中。

    nested_set = {1, 2, 3}
    try:nested_set.add([4, 5, 6])  # 尝试添加列表到集合中# nested_set.add({7, 8, 9})  # 尝试添加另一个集合到集合中
    except TypeError as e:print(e)  # 输出错误信息
    

理解可变和不可变对象的区别对于编写正确、高效的 Python 代码非常重要,特别是在处理对象传递和共享状态时。

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

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

相关文章

DeepSeek私有化部署性能怎么样?企业级AI落地实战解析!

1. 私有化部署是什么?为什么企业需要它? 很多公司在考虑用AI时都会问:“DeepSeek私有化部署性能怎么样?能不能在我们自己的服务器上跑?” 私有化部署的意思就是把AI模型装在你自己的机房或者云服务器上,而…

SQL学习--基础语法学习

SQL和excle对比 学习目标 单表查询 项目背景 SQL 练习环境 SQL Online Compiler - Next gen SQL Editor 商品信息表:https://study-zhibo.oss-cn-shanghai.aliyuncs.com/test/%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF%E8%A1%A8.csv 订单明细表:https://…

【Docker基础-网络】--查阅笔记4

目录 Docker 网络网络类型none 网络host 网络bridge 网络自定义网络 容器间通信IP 通信Docker DNS Serverjoined 容器 容器与外部通信容器访问外部外部访问容器 Docker 网络 学习Docker提供的几种原生网络如何创建自定义网络容器间通信,容器于外界交互 Docker 安装…

GPT模型架构与文本生成技术深度解析

核心发现概述 本文通过系统分析OpenAI的GPT系列模型架构,揭示其基于Transformer解码器的核心设计原理与文本生成机制。研究显示,GPT模型通过自回归机制实现上下文感知的序列生成,其堆叠式解码器结构配合创新的位置编码方案,可有效…

AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑

前言 有这么一个业务,主界面点击应用窗口进入声纳显示界面,声纳显示界面再通过按钮进入菜单界面,菜单界面有很多关于该声纳显示界面的设置项,比如量程,增益,时间显示,亮度,对比度等…

CrystalDiskInfo电脑硬盘监控工具 v9.6.0中文绿色便携版

前言 CrystalDiskInfo是一个不用花钱的硬盘小帮手软件,它可以帮你看看你的电脑硬盘工作得怎么样,健不健康。这个软件能显示硬盘的温度高不高、还有多少地方没用、传输东西快不快等等好多信息。用了它,你就能很容易地知道硬盘现在是什么情况&…

数据分析-数据预处理

数据分析-数据预处理 处理重复值 duplicated( )查找重复值 import pandas as pd apd.DataFrame(data[[A,19],[B,19],[C,20],[A,19],[C,20]],columns[name,age]) print(a) print(--------------------------) aa.duplicated() print(a)只判断全局不判断每个 any() import p…

如何用海伦公式快速判断点在直线的哪一侧

一、海伦公式的定义与推导 1. 海伦公式的定义 海伦公式(Heron’s Formula)是用于计算三角形面积的一种方法,适用于已知三角形三边长度的情况。公式如下: S s ( s − a ) ( s − b ) ( s − c ) S \sqrt{s(s - a)(s - b)(s - c…

python推箱子游戏

,--^----------,--------,-----,-------^--,-------- 作者 yty---------------------------^----------_,-------, _________________________XXXXXX XXXXXX XXXXXX ______(XXXXXXXXXXXX(________(------ 0 [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,…

使用Python建模量子隧穿

引言 量子隧穿是量子力学中的一个非常有趣且令人神往的现象。在经典物理学中,我们通常认为粒子必须克服一个势垒才能通过它。但是,在量子力学中,粒子有时可以“穿越”一个势垒,即使它的能量不足以克服这个势垒。这种现象被称为“量子隧穿”。今天,我们将通过 Python 来建…

Vuex Actions 多参数传递的解决方案及介绍

Vuex Actions 多参数传递的解决方案及介绍 引言 在Vuex状态管理模式中,Actions 扮演着至关重要的角色。它主要用于处理异步操作,并且可以提交 Mutations 来修改全局状态。然而,在实际开发中,我们常常会遇到需要向 Actions 传递多…

设计模式 --- 策略模式

​策略模式(Strategy Pattern)是一种 ​​行为型设计模式​​,用于动态切换算法或策略​​,使得算法可以独立于客户端变化。它通过封装算法策略并使其可互换,提升了系统的灵活性和扩展性,尤其适用于需要多种…

【论文阅读】RMA: Rapid Motor Adaptation for Legged Robots

Paper: https://arxiv.org/abs/2107.04034Project: https://ashish-kmr.github.io/rma-legged-robots/Code: https://github.com/antonilo/rl_locomotion训练环境:Raisim 1.方法 RMA(Rapid Motor Adaptation)算法通过两阶段训练实现四足机器…

QQ风格客服聊天窗口

QQ风格客服聊天窗口 展示引入方式 展示 引入方式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

【家政平台开发(37)】家政平台蜕变记:性能优化与代码重构揭秘

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…

PostgreSQL 的 COPY 命令

PostgreSQL 的 COPY 命令 PostgreSQL 的 COPY 命令是高效数据导入导出的核心工具&#xff0c;性能远超常规 INSERT 语句。以下是 COPY 命令的深度解析&#xff1a; 一 COPY 命令基础 1.1 基本语法对比 命令类型语法示例执行位置文件访问权限服务器端COPYCOPY table FROM /p…

Sa-Token 自定义插件 —— SPI 机制讲解(一)

前言 博主在使用 Sa-Token 框架的过程中&#xff0c;越用越感叹框架设计的精妙。于是&#xff0c;最近在学习如何给 Sa-Token 贡献自定义框架。为 Sa-Token 的开源尽一份微不足道的力量。我将分三篇文章从 0 到 1 讲解如何为 Sa-Token 自定义一个插件&#xff0c;这一集将是前沿…

论文精度:基于LVNet的高效混合架构:多帧红外小目标检测新突破

论文地址:https://arxiv.org/pdf/2503.02220 目录 一、论文背景与结构 1.1 研究背景 1.2 论文结构 二、核心创新点解读 2.1 三大创新突破 2.2 创新结构原理 2.2.1 多尺度CNN前端 2.2.2 视频Transformer设计 三、代码复现指南 3.1 环境配置 3.2 数据集准备 3.3 训…

解决 Ubuntu 上 Docker 安装与网络问题:从禁用 IPv6 到配置代理

解决 Ubuntu 上 Docker 安装与网络问题的实践笔记 在 Ubuntu&#xff08;Noble 版本&#xff09;上安装 Docker 时&#xff0c;我遇到了两个常见的网络问题&#xff1a;apt-get update 失败和无法拉取 Docker 镜像。通过逐步排查和配置&#xff0c;最终成功运行 docker run he…