跳转至

可变不可变

Python中的可变类型主要包括:

  • list(列表)
  • dict(字典)
  • set(集合)
  • bytearray(字节数组)
  • 用户自定义的类实例(通常情况下)

可变类型的特点

可变类型被称为"可变"是因为:

  1. 对象内容可以修改:可以在不改变对象身份(内存地址)的情况下修改其内容
  2. 原地修改:可以通过方法直接修改对象,而不需要创建新对象
  3. 共享引用影响:多个变量引用同一对象时,修改会影响所有引用

不可变类型及其特点

不可变类型包括:

  • int(整数)
  • float(浮点数)
  • str(字符串)
  • tuple(元组)
  • frozenset(冻结集合)
  • bytes(字节串)
  • bool(布尔值)
  • complex(复数)

这些类型被称为"不可变"是因为:

  1. 内容不能修改:一旦创建,对象的内容就不能被改变
  2. 操作产生新对象:对这些类型进行操作时会创建新的对象
  3. 引用独立:修改一个引用不会影响其他引用

核心区别

主要区别在于对象的身份(id) 是否会在修改操作中改变:

  • 可变类型:修改内容时,对象的 id 不变
  • 不可变类型:任何"修改"操作都会产生新对象,原对象的 id 保持不变

对象的身份(id) 其实就是指对象的内存地址。在Python中id可以打印变量地址,变量本质上是引用而不是对象本身,不可变类型的对象就是它的内存就是不可变的,例如对于int类型的变量a,我们对它进行-1操作,其实它是指向了一块新的内存,旧内存仍然是1不改变等待被回收,也就是说旧对象没变动,而是创建了新对象,让该变量指向新对象。