Python:对象的可变性有什么意义?

时间:2018-03-10 19:03:46

标签: python

我随处可读Python中可变对象和不可变对象之间的定义和区别。但为什么这个概念是出于必要而引入的呢?如果不是出于必要,而是说实用性,那有什么意义呢?为什么所有对象都不可变?

1 个答案:

答案 0 :(得分:2)

为什么存在可变性

考虑这个例子。

lst = [None] * 1000000

lst[999999] = True

如果您无法改变列表,则每次要更新列表时都必须将其重新构建。这将是漫长的。

为什么存在不变性

现在考虑另一个例子。

my_script_version = (3, 2, 4) # 3.2.4

my_script_version[0] = 4 # TypeError: 'tuple' object does not support item assignment

有些事情并不意味着要更新,不可变的数据类型对它们有好处。

然后有字典

此外,Python依赖于dict。要使对象成为字典中的键,它必须是不可变的。让我们尝试强制Python使用可变对象作为字典键来查看会发生什么。

class MutableKey(list):
    def __hash__(self):
        return hash(tuple(self)) # We force Python to hash a list as if it were a tuple

key = MutableKey([])

d = {key: 1}
key.append(1)

d[MutableKey([])] # KeyError
d[MutableKey([1])] # KeyError
d[key] # KeyError

对于要成为字典键的对象,它必须始终哈希到相同的值,并且它必须始终以与其他对象相同的方式进行比较。对于可变对象,这两个条件都是错误的。