详细分析之Python可变对象和不可变对象

在 Python 中一切都可以看作为对象。每个对象都有各自的 id, type 和 value。

  1. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使用 id() 去查看对象在内存中地址。
  2. type: 和 id 一样当对象呗创建之后,它的 type 也不能再被改变,type 决定了该对象所能够支持的操作
  3. value: 对象的值

一个对象可变与否就在于 value 值是否支持改变。

相关学习推荐:python视频教程

不可变对象

常见的不可变对象(immutable objects):

  1. Number: int, float, complex
  2. string
  3. tuple
  4. frozenset:set 的另外一种类型

让我们通过例子感受一下

例子

>>> x=1
>>> y=x
>>> id(x)==id(y)
True
>>> id(1)==id(y)
True

这里创建了两个 int 对象,并且让 x,y 指向同一个对象,然后我们试着修改一下 x,让 x+1

>>>x=x+1

这个时候 x 的 id 值和 y 的 id 以及 1 的 id 还一样吗?

>>> x=x+1
>>> id(x)==id(y)
False
>>> id(x)==id(1)
False
>>> id(1)==id(y)
True

从结果不难看出来,x 所指向的对象已经改变了,但是 1 并没有改变。这就是不可变对象,对于不可变对象来说,一旦创建之后就不允许被改变。

注意: 不可变并不严格等同绝对的不可变

>>> a=([1],2,3)
>>> id(a)
4338862696
>>> id(a[0])
4338949128
>>> a[0][0]=0
>>> id(a)
4338862696
>>> id(a[0])
4338949128

从上面的例子不难看出,我们改变了 a[0] 的值,但是并没有影响它的 id 值。一个不可变容器对象如果包含对可变对象的引用,当后者的值改变时,前者的值也会改变;但是该容器仍属于不可变对象,因为它的 id 值不会改变的。

可变对象

常见的可变对象(mutable objects):

  1. list
  2. dict
  3. set

同样的通过例子感受一下

例子

>>> c = [1,2,3]
>>> b = c
>>> id(b)==id(c)
True

创建两个 list 对象,并且让 c,d 指向同一个对象,然后我们试着修改一下 c

c[0]=4

这个时候在看一下两个对象的 id 值是否一致

>>> id(c)==id(b)
True

修改之后,c,d 仍然指向同一个对象,所以不难得出结论,对于一个可变对象来说,修改 value 值并不会对它的 id 造成任何影响

函数参数

对于可变对象和不可变对象,他们两者在函数当作参数传递的时候表现也有所不同

例子

eg0

def update_list(nums_list):
  print(f'2 id:{id(nums_list)}')
  nums_list += [10]
  print(f'3 id:{id(nums_list)}')

  
number_list = [5, 6]
print(f'1:{number_list}, id:{id(number_list)}')   
update_list(number_list)
print(f'4:{number_list}, id:{id(number_list)}')

看一下结果

1:[5, 6], id:4457707912
2 id:4457707912
3 id:4457707912
4:[5, 6, 10], id:4457707912

在看另外一个例子

eg1

def add_num(number):
  print(f'2:{id(number)}')
  number += 1
  print(f'3:{id(number)}')


num = 1
print(f'1:{num}, id:{id(num)}')   
add_num(num)
print(f'4:{num}, id:{id(num)}')

看一下结果

1:1, id:4343768416
2 id:4343768416
3 id:4343768448
4:1, id:4343768416

有其他有些文章中,上面 eg0 被称为引用传递,eg1 被称为值传递。然而在官方文档中,并没有找到有关的这两个名词的任何内容,或者这种方式并不是上述的两者任意一种。

这里的重点是:对于可变对象,在函数中的值的改变,会导致对象改变;对于不可变对象,在函数中值的改变,对其不会造成任何影响

以上就是详细分析之Python可变对象和不可变对象的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

GitHub Copilot对象关系映射:在Hibernate与MyBatis-Plus中快速配置多对多关联

Hibernate需用@ManyToMany+@JoinTable配置User与Role多对多关系,MyBatis-Plus须通过XML中或@Results+@Many实现联查,Copilot可辅助生成代码但需校验表名、字段名一致性。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 要在Hibernate或MyBatis-Plus中让两个实体...
· AI · 12342

如何用千问做产品评论的自动分析?

产品评论自动分析有四种方法:一、零样本情感与维度分类,用通义千问2.5-7B-Instruct按预设维度输出正/负/未提及;二、基于Qwen3-Embedding-4B的无监督聚类,结合UMAP与HDBSCAN发现隐性主题;三、用Qwen3-Reranker-0.6B对业务问题做细粒度相关性重排序;四、跨平台多源评论聚合,对比识别本品独有短板或优势。 ☞☞☞AI 智能聊天, 问答助手, AI 智能...
· AI · 162666

Duck.ai在竞品文案分析中的使用:让AI对比分析竞争对手文案策略的实践教程

Duck.ai提供五维竞品文案分析法:一、结构化语义对比;二、角色驱动策略归因;三、平台语境反向推演;四、合规红线交叉校验;五、动态策略时间轴演化。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您希望深入理解竞争对手在文案层面的表达逻辑、价值锚点与用户触达策略,但人工逐条比对耗时低效且易遗漏隐性模式,则可借助Duck.ai对多源竞品文...
· AI · 16256

千问大模型怎么用来做舆情监控分析?社交媒体舆论分析自动化方案

针对社交媒体品牌口碑自动分析,可选用五种方法:一、Qwen2.5-0.5B-Instruct本地轻量情感分类;二、Qwen3-1.7B构建流式舆情监控管道;三、Qwen3-Reranker-0.6B实现热点话题精准排序;四、Qwen2.5-7B-Instruct部署危机预警闭环系统;五、OpenClaw+Qwen3.5-9B实现关键词驱动的监测与发布联动。 ☞☞☞AI 智能聊天, 问答助手, AI...
· AI · 254419

如何用Kimi分析公众号文章趋势_利用Kimi联网数据分析

Kimi可实时抓取分析公众号文章趋势:一、联网检索近7天含关键词的推文并结构化提取元数据;二、批量解析多篇文章的主题聚类与情绪倾向;三、构建30天关键词热度时间序列图谱;四、拆解10w+爆文结构并反向生成优化方案。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您希望掌握公众号内容的传播规律与读者兴趣变化,但缺乏对海量文章数据的实时洞察...
· AI · 28449

豆包AI怎么分析评论_豆包AI评论分析方法【教程】

豆包AI情绪识别不准可能因输入格式不规范、提示词模糊或未调用合适分析路径;可通过直接对话式情感分析或Embedding向量相似度判别法实现精准判断。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您向豆包AI提交一段用户评论或普通文本,但未获得准确的情绪判断结果,则可能是由于输入格式不规范、提示词模糊或未调用合适分析路径所致。以下是实现...
· AI · 10368

海螺AI怎么用来做行业趋势分析?

若海螺AI行业趋势分析结果泛化、时间错乱、指标缺失或无法识别新兴赛道,需分三步解决:一、用“行业动态+查数据”功能建模,上传结构化数据并输入明确指令;二、用网页插件抓取小红书、GitHub等非传统信源并语义聚合;三、通过API接入政策、招标、专利库构建定制化监测看板。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您在使用海螺AI进行行...

海螺AI能分析数据做图表吗?

若海螺AI处理表格结果不准确,应依场景选择对应方案:一、用“智能搜索+查数据”解析结构化表格;二、PDF/扫描件启用OCR+MoE联合解析;三、API接入BI系统批量处理;四、Mermaid智绘流程图;五、识图功能反向生成图表数据与解读。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您在使用海螺AI处理财务报表、业务数据表或学术研究表...
· AI · 116620