You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中可变与不可变对象的实现机制疑问

Python可变与不可变对象内存机制的核心逻辑

先把核心逻辑说透:Python里的不可变对象(比如int、str、tuple)之所以不直接覆盖旧内存,而是分配新地址,本质是为了保证数据安全、简化内存管理,适配Python的引用语义。

为什么不能直接写入旧内存?

  • 引用共享的坑:Python里多个变量可以指向同一个不可变对象。比如:
    a = "hello"
    b = a
    
    此时a和b共享同一块内存里的"hello"。要是允许直接修改这块内存改成"world",那b的值会被意外篡改——你根本排查不出哪个变量偷偷改了共享数据,程序逻辑会彻底乱套。
  • 内存结构限制:很多不可变对象的内存大小是固定死的。比如CPython里的小整数是提前缓存好的,内存空间预分配,没法扩容或修改内容;再比如str底层是固定长度的字符数组,硬改旧内存可能会溢出,破坏相邻内存的数据。

新地址存储的核心优势

  • 天然线程安全:不可变对象不会被修改,多个线程同时读取时不需要加锁,省去了线程同步的开销。
  • 缓存复用省内存:Python会缓存常用的不可变对象,比如-5到256的小整数、短字符串。用新地址存储的话,这些缓存对象能被多个变量重复引用,不用反复分配新内存。
  • 垃圾回收更简单:不可变对象的引用计数管理没负担——只要引用计数归0,直接回收就行,不用考虑对象内部结构的变化。
  • 哈希值稳定:不可变对象能当字典的键,因为它们的哈希值固定。要是允许修改旧内存,哈希值会跟着变,字典的哈希表直接失效,键找不到、冲突满天飞。

举个直观的例子:

x = 10
y = x
x = 20
# 此时y还是10,因为x指向了新内存,y仍守着原来的10

要是直接改旧内存,y的值会莫名其妙变成20,完全违背开发者的预期。

内容的提问来源于stack exchange,提问作者Slaycapь

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:39:51