Skip to content

可变与不可变数据类型

不可变数据类型

当该类型的对象的值不能被修改时,该数据类型被称为不可变的。

以下数据类型是不可变的:

  • int
  • float
  • complex
  • bool
  • tuple
  • str
  • None

你可能想知道,如果上述某些类型是不可变的,那我们是如何修改变量的值的呢?

在变量重新赋值的情况下,原始对象不会被修改,而是在新的内存位置创建新的对象(具有新值),并将变量绑定到这些新对象上。如果没有任何其他变量引用包含旧值的对象,则该对象将被销毁。

让我们举个例子,

python
>>> a = 1
>>> id_a = id(a)
>>> a = 2
>>> id_a2 = id(a)
>>> id_a == id_a2
False

在上面的示例中,你可以看到包含值 1 的对象与包含值 2 的对象不同,并且 a 指向最新的对象。

像字符串和元组这样的序列数据类型也是不可变的,即一旦创建,不允许对其任何项进行修改,任何这样做的尝试都会引发错误。

python
>>> s = "Hello"
>>> s[1] = "P"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> t = (1, 2, 3)
>>> t[1] = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

不过,与数字类型类似,变量可以重新赋值给新的序列。

python
>>> s = "Hello"
>>> id_s = id(s)
>>> s = "Help"
>>> id_s2 = id(s)
>>> id_s == id_s2
False

>>> t = (1, 2, 3)
>>> id_t = id(t)
>>> t = (0, 2, 3)
>>> id_t2 = id(t)
>>> id_t == id_t2
False

可变数据类型

在 Python 中,以下数据类型是可变的,即任何修改都不会创建新对象,而是修改现有对象:

  • list
  • set
  • dict

让我们以列表为例并修改其内容。

python
>>> l = [1, 2, 3]
>>> id_l = id(l)
>>> l[0] = 0
>>> l
[0, 2, 3]
>>> id_l2 = id(l)
>>> id_l == id_l2
True

让我们以字典为例,并添加一个新的 键:值 对。

python
>>> d = {"a": "apple", "b": "boy"}
>>> id_d = id(d)
>>> d["c"] = "cat"
>>> d
{'a': 'apple', 'b': 'boy', 'c': 'cat'}
>>> id_d2 = id(d)
>>> id_d == id_d2
True

让我们以集合为例,并添加一个新项。

python
>>> s = {"apple", "bat"}
>>> id_s = id(s)
>>> s.add("cat")
>>> s
{'cat', 'apple', 'bat'}
>>> id_s2 = id(s)
>>> id_s == id_s2
True

在上面的示例中,对象(list, dict, set)的 id 没有改变,这意味着没有创建新对象,而是修改了原始对象。