我们来深入解析 Python 中一个核心概念:可变(Mutable)对象和不可变(Immutable)对象。这个概念直接关系到你的代码在内存中如何运作,尤其是在进行赋值、拷贝、传参等操作时,理解它可以帮助你避免许多难以发现的 bug。
核心定义
判断一个对象是可变的还是不可变的,标准只有一个:当对象创建之后,它里面的值能否被改变?
- 不可变对象:对象创建后,其内容(或状态)无法被修改。如果你尝试修改它,Python 实际上会创建一个新的对象,而不是在原有对象上修改。
- 可变对象:对象创建后,其内容(或状态)可以被修改。你可以在原内存地址上直接修改对象的值,而不会创建新对象。
1. 常见的不可变对象
- 整数(int)
- 浮点数(float)
- 布尔值(bool)
- 字符串(str)
- 元组(tuple) —— 注意:元组本身不可变,但如果它包含可变对象(如列表),那个内部对象是可变的。
- 冻结集合(frozenset)
示例:看似"修改"了不可变对象
name = "hello"
print(f"原始对象的内存地址:{id(name)}")
name = name + " world"
print(f"新对象的内存地址:{id(name)}")
发生了什么?
当执行 name = name + " world" 时,Python 并没有在原来的字符串 "hello" 后面添加内容。因为字符串是不可变的,它不能直接在原处修改。所以,Python 在内存中创建了一个全新的字符串对象 "hello world",然后将变量 name 重新指向了这个新对象。原来的 "hello" 对象如果没有其他变量引用,最终会被垃圾回收。
2. 常见的可变对象
- 列表(list)
- 字典(dict)
- 集合(set)
- 自定义类的实例对象(默认情况下)
示例:修改可变对象
my_list = [1, 2, 3]
print(f"修改前列表的内存地址:{id(my_list)}")
my_list.append(4)
()
()

