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

我已经阅读了一些python教程(比如深入python),以及python.org上的语言参考——我不明白为什么该语言需要元组

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

不变性

为什么有人关心变量在内存中的位置是否与最初分配时不同?Python中的不变性似乎被过分强调了

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

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

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

&gt&燃气轮机&燃气轮机;x='你好'
&燃气轮机&燃气轮机&燃气轮机;id(x)
1234567
&燃气轮机&燃气轮机&燃气轮机;x='再见'
&燃气轮机&燃气轮机&燃气轮机;id(x)
5432167

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

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

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

优化问题示例:

$python-mtimeit'[“fee”、“fie”、“fo”、“fum”]
1000000个循环,最好3个:每个循环0.432 usec
$python-mtimeit'(“fee”、“fie”、“fo”、“fum”)'
10000000个循环,最好为3个:每个循环0.0563 usec

发表评论