【发布时间】:2016-07-07 09:02:10
【问题描述】:
我对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
输出:
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),但是值不同。这只有在索引是可变的时才有可能。
为什么会出现这种不一致?在这种情况下,它们是可变的,但在其他情况下是不可变的
更新:
下面很少有 cmets 指出与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
【问题讨论】:
-
不,这只是表示内存位置被重用stackoverflow.com/questions/35173479/…
标签: python python-2.7 pandas indexing immutability