【补充】可变类型和不可变类型

【补充】可变类型和不可变类型

【1】可变类型

  • 可变类型是指在创建后可以被修改的对象。
  • 与不可变类型相反,可变类型的值可以进行增、删、改等操作,而不会改变其身份标识。
  • 列表(List):

    • 列表是一种用于存储多个元素的可变有序容器。

    • 可以通过索引来访问、添加、删除和修改列表中的元素。

  • 字典(Dictionary):

    • 字典是一种键值对的可变集合,其中的键和对应的值可以任意修改、添加和删除。
  • 集合(Set):

    • 集合是一种无序的、可变的容器,它内部元素的顺序是不确定的。

    • 可以用于去重、判断元素是否存在以及各种集合操作(如交集、并集、差集等)。

  • bytearray:

    • bytearray是一种可变的字节数组,它可以存储整数范围内的字节,且可以进行修改。
  • 在使用可变类型时需要注意的是,由于其可变性,可能会带来一些问题。
    • 例如,在对可变类型进行浅拷贝(shallow copy)或传递给函数时
      • 实际上是传递对象的引用
      • 而不是新建一个独立的对象。
    • 这意味着对于同一个可变对象的修改
      • 将会在所有引用对象中都生效。
    • 这可能会导致意外的副作用。
  • 为了避免这些问题,有时需要采取适当的措施来确保可变对象不会无意中被修改。
    • 可以使用深拷贝(deep copy)创建一个独立的可变对象副本
    • 或使用不可变类型来替代可变类型
    • 在确保不需要修改的情况下使用元组等不可变容器。

【2】不可变类型

  • 不可变类型是指在创建后不能被修改的对象。
  • 与可变类型相反,不可变类型的值一旦确定就无法再次改变。
  • 数字(Number):

    • 包括整数(int)、浮点数(float)、复数(complex)等。

    • 数字类型的值在创建后不可修改,需要重新赋值来改变其值。

  • 字符串(String):

    • 字符串是由字符组成的不可变序列,在创建后不能进行修改。

    • 可以通过切片和拼接等操作来创建新的字符串对象。

  • 元组(Tuple):

    • 元组是有序且不可变的集合,其中的元素在创建后不能被修改。

    • 可以通过索引访问元素,但不能对元素进行增、删、改操作。

  • 不可变集合(frozenset):

    • 不可变集合是一种不可变的集合类型,其中的元素不可被修改。
    • 与可变集合不同,不可变集合本身不能增加或删除元素。

不可变类型具有以下特点:

  • 身份标识不变:不可变对象的身份标识在创建后保持不变,即对象的内存地址不会发生变化。
  • 值不能修改:不可变对象创建后,其值不能再被修改,任何尝试修改值的操作都将引发异常。

使用不可变类型时的注意事项:

  • 需要注意的是

    • 虽然不可变对象本身的值不能被修改

    • 但对于包含可变对象的不可变类型(如包含列表的元组)来说

      • 可变对象的值是可以被修改的。
    • 这会导致不可变类型的某些部分看起来是可变的。

  • 不可变类型对于并发操作具有线程安全性

    • 因为不需要考虑修改的同步问题。
  • 在使用不可变类型时

    • 通常可以避免副作用和意外修改的风险
    • 使代码更加可靠和稳定。
posted @ 2023-07-25 15:32  Chimengmeng  阅读(84)  评论(0)    收藏  举报