我总是发现对于同一基本数据结构(数组)具有两种完全不同的类型是不方便的, 但是实际上这并不是真正的问题。(每种语言都有其缺点, 包括Python, 但这并不是那么重要。)
为什么有人会关心变量在内存中的位置是否与最初分配时不同? 在Python中似乎非常重视此不变性问题。
这是两件事。易失性与其在内存中的存储位置无关。这意味着它指向的物料
无法更改。
创建后, 无论对象是否可变, 都无法更改其位置。(更确切地说, id()值不能更改, 实际上是相同的。)可变对象的内部存储可以更改, 但这是一个隐藏的实现细节。
>>> x='hello'
>>> id(x)
1234567
>>> x='good bye'
>>> id(x)
5432167
这不会修改(更改)变量; 它将创建一个具有相同名称的新变量, 并丢弃旧变量。与更改操作比较:
>>> a = [1,2,3]
>>> id(a)
3084599212L
>>> a[1] = 5
>>> a
[1, 5, 3]
>>> id(a)
3084599212L
正如其他人指出的那样, 这允许将数组用作字典和其他要求不变性的数据结构的键。
注意, 字典的键不必完全不变。用作密钥的部分应保持不变; 对于某些目的, 这是一个重要的区别。例如, 您可能有一个代表用户的类, 该类将唯一用户名与哈希值的相等性进行比较。然后, 您可以将其他变量数据附加到类用户已登录, 依此类推。由于这不会影响相等性或哈希, 因此可以将其用作字典中的键是完全可以接受的。这在Python中并不经常需要; 我只是指出这一点, 因为有几个人争辩说密钥应该是不可变的, 这只是部分正确的。但是, 我在C++映射和收集中使用了很多次。