Python索引的不一致性

时间:2016-03-20 23:55:29

标签: python python-2.7 pandas indexing immutability

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

我们知道Python Index对象是Immutable,这意味着我们无法修改每个Index值。但请考虑以下示例

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

出:

133636144 Index([u'Ohio', u'Colorado', u'New york'], dtype='object')
133636144 Index([u'INDIANA', u'Colorado', u'New york'], dtype='object')

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

怎么会出现这种不一致的情况?在这种情况下,它们是Mutable,但不可变,否则

更新

以下几条评论指出与Why is the id of a Python class not unique when called quickly?问题的相似之处。

但我尝试使用此代码,我打算将索引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

1 个答案:

答案 0 :(得分:0)

基于id()的文档:

  

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

     

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

如果一个对象被垃圾收集,它的id(也就是内存地址)可以被回收用于新对象。