为什么Python中的元组是不可变的?

7
2个回答

27

几点原因:

  • 在Python中,像列表这样的可变对象不能用作字典键或集合成员,因为它们不是 可哈希 的。如果基于其内容给列表提供了__hash__方法,则返回的值可能会随着内容的更改而更改,这将违反哈希值的约定。
  • 如果Python只有可变序列,那么接受序列的构造函数通常需要复制它们,以确保序列不能被其他代码修改。构造函数可以通过仅接受元组来避免防御性复制。更好的方法是,它们可以通过tuple方法传递序列参数,只有在必要时才进行复制。

它们的哈希值可以改变?嗯? - wim
2
当列表发生更改时,WIM的哈希值也会更改。如果列表在其他地方有引用,则列表可能会更改。 - Esben Skov Pedersen
你能详细说明一下 "构造函数可以将序列参数包装在元组中,只有在必要时才会复制" 的意思吗? - qazwsx
通常,tuple(..)会创建一个新的元组对象,从给定的可迭代对象中复制每个元素(通常是一个列表)。但是,如果参数已经是一个元组,则该元组将被返回且不会进行任何复制。 - Daniel Lubarov
一个集合成员就是集合中包含的一个对象。我想要说明的是,Python不允许像{[]}这样的集合,因为Python的集合实现依赖于一致的哈希,而可变对象如列表是不可哈希的。 - Daniel Lubarov

1

否则就不会有不可变序列类型了!如果你想要一个可变的元组,你只需要使用列表。

在适当的情况下使用不可变类型具有各种性能优势,如果元组是可变的,你将无法轻松地使用带有元组键的字典。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接