可变与不可变数据类型
不可变数据类型
当该类型的对象的值不能被修改时,该数据类型被称为不可变的。
以下数据类型是不可变的:
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
没有改变,这意味着没有创建新对象,而是修改了原始对象。