Python索引的不一致不变性

Python索引的不一致不变性,python,python-2.7,pandas,indexing,immutability,Python,Python 2.7,Pandas,Indexing,Immutability,我对Python比较陌生,遇到过这个有趣的案例 我们知道Python索引对象是不可变的,这意味着我们不能修改每个索引值。但是考虑下面的例子 data = DataFrame(np.arange(12).reshape((3, 4)), index=['Ohio', 'Colorado', 'New york'], columns=['one', 'two', 'three', 'four']) print id(data.ind

我对Python比较陌生,遇到过这个有趣的案例

我们知道Python索引对象是不可变的,这意味着我们不能修改每个索引值。但是考虑下面的例子

data = DataFrame(np.arange(12).reshape((3, 4)),
                 index=['Ohio', 'Colorado', 'New york'],
                 columns=['one', 'two', 'three', 'four'])
print id(data.index),data.index
data.rename(index={'Ohio': 'INDIANA'}, inplace=True, columns={'three': 'peekaboo'})
print id(data.index), data.index
输出:

在这里,我们观察到Index对象实际上是可变的,因为在2条print语句中,data.Index的id是相同的(指向相同的Index对象),但值不同。只有当索引是可变的时,这才是可能的

为什么会有这种不一致?在这种情况下,它们是可变的,但在其他情况下是不可变的

更新:

下面很少有评论指出与这个问题的相似之处

但是我尝试使用这段代码,我打算将索引ID信息保存在一个列表中。 正在执行查询

data = DataFrame(np.arange(12).reshape((3, 4)),
index=['Ohio', 'Colorado', 'New york'],
columns=['one', 'two', 'three', 'four'])
x = []
x.append(id(data))
x.append(data.index)
data.rename(index={'Ohio': 'INDIANA'}, inplace=True,columns={'three':                      'peekaboo'})
print id(data),data.index
print x[0],x[1]
提供相同的输出

135289936 Index([u'INDIANA', u'Colorado', u'New york'], dtype='object')
135289936 Index([u'Ohio', u'Colorado', u'New york'], dtype='object')
不是这样吗:垃圾收集器不能销毁数据,因为它的信息仍然保存在列表中。
换句话说,这不意味着数据对象没有被销毁,因为根据以下文档,列表的第一个元素仍然指向ID:

返回对象的“标识”。这是一个整数(或长整数),保证该对象在其生存期内唯一且不变。两个生命周期不重叠的对象可能具有相同的id()值

CPython实现细节:这是内存中对象的地址


如果一个对象被垃圾收集,它的id(又名内存地址)可以为一个新对象回收。

否,这只意味着内存位置被重用
135289936 Index([u'INDIANA', u'Colorado', u'New york'], dtype='object')
135289936 Index([u'Ohio', u'Colorado', u'New york'], dtype='object')