不可变对象的用例是什么?

时间:2015-07-24 00:35:21

标签: python

python中的tuple等不可变类型/对象的用例是什么。

Tuple('hello')
 ('h','i')

我们可以使用不可更改的序列。

4 个答案:

答案 0 :(得分:3)

一个常见的用例是函数的(未命名的)参数列表。

In [1]: def foo(*args):
   ...:     print(type(args))
   ...:     

In [2]: foo(1,2,3)
<class 'tuple'>

答案 1 :(得分:3)

从技术上讲,元组在语义上与列表不同。

当你有一个列表时,你有一些东西......列表。某种物品。因此可以添加或删除项目。

另一方面,元组是给定顺序中的一组值。它恰好是一个由多个值组成的值。复合值。

例如。说你有意见。 X,Y。您可以拥有一个名为Point的类,但该类将有一个字典来存储其属性。一个点只有两个值,大多数时候一起使用。您不需要字典的灵活性或成本来存储命名属性,您可以使用元组代替。

myPoint = 70, 2

点总是X和Y.总是2个值。它们不是数字列表。它们是两个值,其中值的顺序很重要。

元组使用的另一个例子。一个从元组列表创建链接的函数。元组必须是href,然后是链接的标签。固定订单。有意义的订单。

def make_links(*tuples):
    return "".join('<a href="%s">%s</a>' % t for t in tuples)

make_links(
    ("//google.com", "Google"),
    ("//stackoveflow.com", "Stack Overflow")
)

所以元组不改变的原因是因为它们应该是单个值。你只能一次分配整个东西。

答案 2 :(得分:2)

这是一个很好的资源,它描述了元组和列表之间的区别,以及使用每个元组的原因:https://mail.python.org/pipermail/tutor/2001-September/008888.html

该链接中概述的主要原因是元组是不可变的,并且不如列表那么广泛。这使得它们仅在某些情况下有用,但如果能够识别这些情况,元组占用的资源就会少得多。

答案 3 :(得分:1)

在许多情况下,不可变对象会使生活更简单。它们特别适用于价值类型,其中对象不具有身份,因此可以轻松替换它们。并且它们可以使并发编程更安全和更清晰(大多数众所周知的很难找到并发错误最终是由线程之间共享的可变状态引起的)。然而,对于大型和/或复杂对象,为每个单独的改变创建对象的新副本可能是非常昂贵和/或繁琐的。对于具有不同身份的对象,更改现有对象比创建新的已修改副本更加简单直观。