Python 可变对象和不可变对象

· · 个人记录

在Python中,对象可分为可变对象(Mutable Objects)和不可变对象(Immutable Objects)。这两者的主要区别在于对象创建后,其内部状态能否被修改

不可变对象 (Immutable Objects)

不可变对象一旦创建,其值就不能被改变。任何对不可变对象进行“修改”的操作,实际上都是创建了一个新的对象。

常见的不可变对象包括:

举个例子,当你对一个字符串进行拼接操作时:

s = "Hello"
s = s + " World" 
print(s)  # 输出 "Hello World"

虽然看起来 s 的值改变了,但实际上,s + " World" 这个操作创建了一个新的字符串对象 "Hello World",然后将 s 指向了这个新对象,而原始的 "Hello" 字符串对象并没有被修改。

可变对象 (Mutable Objects)

可变对象创建后,其内部状态可以被修改,而对象的内存地址保持不变。

常见的可变对象包括:

例如,当你修改一个列表时:

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)比创建新对象更有效率。

简而言之,可变对象就像一块可以被雕刻的粘土,而不可变对象就像一个玻璃球,一旦成型就不能改变,任何“改变”都需要一个全新的玻璃球。