【问题标题】:Inconsistent Immutability of Python Index [duplicate]Python索引的不一致不变性[重复]
【发布时间】: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

【问题讨论】:

标签: python python-2.7 pandas indexing immutability


【解决方案1】:

基于id()的文档:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2022-08-08
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多