为什么我们需要在Python(或任何不可变数据类型)中使用元组?

2024-05-29 10:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经阅读了一些python教程(其中一个是关于python的),以及python.org上的语言参考资料——我不明白为什么该语言需要元组。

元组与列表或集合相比没有任何方法,如果必须将元组转换为集合或列表才能对它们进行排序,那么首先使用元组有什么意义?

不变性?

为什么有人关心变量是否位于内存中与最初分配时不同的位置?Python中的整个不可变业务似乎被过分强调了。

在C/C++中,如果我分配一个指针并指向某个有效的内存,我不关心地址在哪里,只要它在使用之前不是空的。

每当我引用那个变量时,我不需要知道指针是否仍然指向原始地址。我只是检查空值并使用它(或不使用)。

在Python中,当我分配一个字符串(或元组)时,将它分配给x,然后修改字符串,为什么我要关心它是否是原始对象?只要变量指向我的数据,这就是最重要的。

>>> x='hello'
>>> id(x)
1234567
>>> x='good bye'
>>> id(x)
5432167

x仍然引用我想要的数据,为什么有人需要关心它的id是相同还是不同?


Tags: 数据方法内存字符串org语言id列表
3条回答

if I must convert a tuple to a set or list to be able to sort them, what's the point of using a tuple in the first place?

在这种情况下,可能没有一点意义。这不是问题,因为这不是考虑使用元组的情况之一。

正如您所指出的,元组是不可变的。不可变类型的原因适用于元组:

  • 复制效率:与复制不可变对象不同,您可以对其进行别名(将变量绑定到引用)
  • 比较效率:使用按引用复制时,可以通过比较位置而不是内容来比较两个变量
  • 实习:您最多需要存储任何不可变值的一个副本
  • 不需要同步对并发代码中不可变对象的访问
  • 常量正确性:不应允许更改某些值。这(对我来说)是不可变类型的主要原因。

请注意,特定的Python实现可能没有使用上述所有特性。

字典键必须是不可变的,否则更改键对象的属性可能会使底层数据结构的不变量失效。因此元组可以潜在地用作键。这是常量正确性的结果。

另请参见Dive Into Python中的“Introducing tuples”。

  1. 不可变对象可以实现实质性的优化;这大概就是为什么字符串在Java中也是不可变的,它是与Python完全独立但几乎同时开发的,而且几乎所有的东西在真正的函数式语言中都是不可变的。

  2. 特别是在Python中,只有不可变的可以散列(因此,集合的成员或字典中的键)。同样,这也提供了优化,但远远不止是“实质性的”(设计一个像样的哈希表来存储完全可变的对象是一场噩梦——要么你在对所有对象进行哈希运算时立即对其进行复制,要么就是检查对象的哈希自上次引用后是否发生了更改,这是一场噩梦。

优化问题示例:

$ python -mtimeit '["fee", "fie", "fo", "fum"]'
1000000 loops, best of 3: 0.432 usec per loop
$ python -mtimeit '("fee", "fie", "fo", "fum")'
10000000 loops, best of 3: 0.0563 usec per loop

上面的答案都没有指出元组vs列表的真正问题,Python的许多新手似乎并不完全理解这个问题。

元组和列表有不同的用途。列表存储同质数据。你可以也应该有这样的清单:

["Bob", "Joe", "John", "Sam"]

之所以正确使用列表,是因为这些都是相同类型的数据,特别是人名。但请看这样的清单:

["Billy", "Bob", "Joe", 42]

名单上有一个人的全名和年龄。这不是一种数据类型。存储该信息的正确方法是在元组或对象中。假设我们有几个:

[("Billy", "Bob", "Joe", 42), ("Robert", "", "Smith", 31)]

元组和列表的不变性和可变性并不是主要区别。列表是同类项目的列表:文件、名称、对象。元组是一组不同类型的对象。它们有不同的用途,许多Python编码人员滥用列表来说明元组的用途。

请不要


编辑:

我想这篇博文解释了为什么我认为这比我做的更好:http://news.e-scribe.com/397

相关问题 更多 >

    热门问题