我随处可读Python中可变对象和不可变对象之间的定义和区别。但为什么这个概念是出于必要而引入的呢?如果不是出于必要,而是说实用性,那有什么意义呢?为什么所有对象都不可变?
答案 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
对于要成为字典键的对象,它必须始终哈希到相同的值,并且它必须始终以与其他对象相同的方式进行比较。对于可变对象,这两个条件都是错误的。