我已经阅读了一些python教程(其中一个是关于python的),以及python.org上的语言参考资料——我不明白为什么该语言需要元组。
元组与列表或集合相比没有任何方法,如果必须将元组转换为集合或列表才能对它们进行排序,那么首先使用元组有什么意义?
不变性?
为什么有人关心变量是否位于内存中与最初分配时不同的位置?Python中的整个不可变业务似乎被过分强调了。
在C/C++中,如果我分配一个指针并指向某个有效的内存,我不关心地址在哪里,只要它在使用之前不是空的。每当我引用那个变量时,我不需要知道指针是否仍然指向原始地址。我只是检查空值并使用它(或不使用)。
在Python中,当我分配一个字符串(或元组)时,将它分配给x,然后修改字符串,为什么我要关心它是否是原始对象?只要变量指向我的数据,这就是最重要的。
>>> x='hello'
>>> id(x)
1234567
>>> x='good bye'
>>> id(x)
5432167
x
仍然引用我想要的数据,为什么有人需要关心它的id是相同还是不同?
在这种情况下,可能没有一点意义。这不是问题,因为这不是考虑使用元组的情况之一。
正如您所指出的,元组是不可变的。不可变类型的原因适用于元组:
请注意,特定的Python实现可能没有使用上述所有特性。
字典键必须是不可变的,否则更改键对象的属性可能会使底层数据结构的不变量失效。因此元组可以潜在地用作键。这是常量正确性的结果。
另请参见Dive Into Python中的“Introducing tuples”。
不可变对象可以实现实质性的优化;这大概就是为什么字符串在Java中也是不可变的,它是与Python完全独立但几乎同时开发的,而且几乎所有的东西在真正的函数式语言中都是不可变的。
特别是在Python中,只有不可变的可以散列(因此,集合的成员或字典中的键)。同样,这也提供了优化,但远远不止是“实质性的”(设计一个像样的哈希表来存储完全可变的对象是一场噩梦——要么你在对所有对象进行哈希运算时立即对其进行复制,要么就是检查对象的哈希自上次引用后是否发生了更改,这是一场噩梦。
优化问题示例:
上面的答案都没有指出元组vs列表的真正问题,Python的许多新手似乎并不完全理解这个问题。
元组和列表有不同的用途。列表存储同质数据。你可以也应该有这样的清单:
之所以正确使用列表,是因为这些都是相同类型的数据,特别是人名。但请看这样的清单:
名单上有一个人的全名和年龄。这不是一种数据类型。存储该信息的正确方法是在元组或对象中。假设我们有几个:
元组和列表的不变性和可变性并不是主要区别。列表是同类项目的列表:文件、名称、对象。元组是一组不同类型的对象。它们有不同的用途,许多Python编码人员滥用列表来说明元组的用途。
请不要
编辑:
我想这篇博文解释了为什么我认为这比我做的更好:http://news.e-scribe.com/397
相关问题 更多 >
编程相关推荐