专栏文章

Python 可变对象和不可变对象

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miojrsnv
此快照首次捕获于
2025/12/02 20:21
3 个月前
此快照最后确认于
2025/12/02 20:21
3 个月前
查看原文
在Python中,对象可分为可变对象(Mutable Objects)和不可变对象(Immutable Objects)。这两者的主要区别在于对象创建后,其内部状态能否被修改

不可变对象 (Immutable Objects)

不可变对象一旦创建,其值就不能被改变。任何对不可变对象进行“修改”的操作,实际上都是创建了一个新的对象。
常见的不可变对象包括:
  • 数字类型: int(整型)、float(浮点型)、complex(复数)
  • 字符串: str
  • 元组: tuple
  • 冻结集合: frozenset
举个例子,当你对一个字符串进行拼接操作时:
PYTHON
s = "Hello"
s = s + " World" 
print(s)  # 输出 "Hello World"
虽然看起来 s 的值改变了,但实际上,s + " World" 这个操作创建了一个新的字符串对象 "Hello World",然后将 s 指向了这个新对象,而原始的 "Hello" 字符串对象并没有被修改。

可变对象 (Mutable Objects)

可变对象创建后,其内部状态可以被修改,而对象的内存地址保持不变。
常见的可变对象包括:
  • 列表: list
  • 字典: dict
  • 集合: set
  • 自定义类实例
例如,当你修改一个列表时:
PYTHON
my_list = [1, 2, 3]
print(id(my_list))  # 查看初始内存地址

my_list.append(4)
print(id(my_list))  # 内存地址不变
print(my_list)      # 输出 [1, 2, 3, 4]
这里,append() 方法直接在原有的 my_list 对象上进行了修改,并没有创建新的列表对象。

可变与不可变对象的影响

理解可变与不可变对象的区别非常重要,它会影响到你编写代码的方式,尤其是在以下几个方面:
  1. 函数参数传递:
    • 当不可变对象作为参数传入函数时,函数内部对它的“修改”不会影响到函数外部的原始对象。
    • 当可变对象作为参数传入函数时,函数内部对它的修改会直接反映到函数外部。
  2. 字典的键:
    • 由于字典的键必须是可哈希的(hashable),而可哈希的对象必须是不可变的,因此只有不可变对象(如字符串、元组)才能作为字典的键。列表、字典等可变对象不能作为字典的键。
  3. 性能:
    • 在某些情况下,对可变对象进行原地修改(in-place modification)比创建新对象更有效率。
简而言之,可变对象就像一块可以被雕刻的粘土,而不可变对象就像一个玻璃球,一旦成型就不能改变,任何“改变”都需要一个全新的玻璃球。

评论

0 条评论,欢迎与作者交流。

正在加载评论...