我听说过这行"不可变对象是可以使用的#34;,就像这样,
Frozensets是不可变的,总是可以随意使用。
但是tuples
是不可变的但不可以播放?为什么呢?
答案 0 :(得分:3)
如果里面的元素是可以清洗的,那么元组非常易于使用。
>>> hashable = (1,2,4)
>>> not_hashable = ([1,2],[3,4])
>>> hash_check = {}
>>> hash_check[hashable] = True
>>> hash_check
{(1, 2, 4): True}
>>> hash_check[not_hashable] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>
答案 1 :(得分:1)
并非所有不可变对象都是可清除的。此外,只有包含可变对象的元组不可清除。
>>> t = (1, 2)
>>> hash(t)
1299869600
>>> t = ([1], [2])
>>> hash(t)
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
hash(t)
TypeError: unhashable type: 'list'
所以,问题是列表,而不是元组。
答案 2 :(得分:1)
即使元组本身是不可变的,它们也可能包含可变对象,例如,如果可以的话:
person = {'name': 'John', 'surname': 'Doe'}
key = (person, True)
cache = {}
cache[key] = datetime.now() # for example
person['surname'] = 'Smith'
cache[key] # What is the expected result?