在python中,每个数据都是一个对象。按照创建之后能否修改其内容,对象被分为可变对象和不可变对象两大类。搞清楚这个概念,有助于我们理解变量赋值、函数传参时的行为差异。

什么是不可变对象
不可变对象是指对象在内存中被创建后,它的值就不能再被改变。如果看起来像是修改了,其实是重新创建了一个新对象,原对象并没有变。常见的不可变类型有:
- 整数 int
- 浮点数 float
- 字符串 str
- 元组 tuple
- 布尔值 bool
我们可以用 id() 函数观察对象的内存地址。当对不可变对象做运算并重新绑定时,地址会发生变化:
a = 10 print(id(a)) # 输出原地址 a = a + 5 print(id(a)) # 地址改变,说明生成了新对象
什么是可变对象
可变对象在创建之后,可以对其内部数据直接修改,而对象本身的内存地址保持不变。常见的可变类型包括:
- 列表 list
- 字典 dict
- 集合 set
下面这段代码中,列表追加元素后,变量 b 指向的地址并没有变:
b = [1, 2, 3] print(id(b)) b.append(4) print(b) print(id(b)) # 地址相同
两者的主要区别
最核心的区别体现在赋值和函数传参上。不可变对象赋值给多个变量时,各变量最初指向同一对象,但修改其中一个会生成新对象,不影响其他变量;可变对象多个变量指向同一对象时,通过任一变量修改内容,其他变量看到的数据也会变。
| 类型 | 可否修改 | 常见例子 |
|---|---|---|
| 不可变对象 | 否 | int, str, tuple |
| 可变对象 | 是 | list, dict, set |
函数传参中的表现
看一个容易踩坑的例子:
def change(x, y):
x = x + 1 # 不可变,局部重新绑定
y.append(99) # 可变,直接修改原对象
a = 5
b = [1]
change(a, b)
print(a) # 5,未受影响
print(b) # [1, 99],被修改
总结建议
在写 python 代码时,如果希望函数内部不改动外部数据,传入不可变对象或显式拷贝可变对象会更安全。理解 id() 与赋值机制,能帮你避开不少隐蔽的 bug。
pythonmutable_objectimmutable_objectid_functionassignment修改时间:2026-07-25 04:36:17