在python2.6中可以更改变量的id值吗?

在python2.6中可以更改变量的id值吗?,python,Python,有人可以通过idcommand:帮助我理解与python中的值链接的内存空间的概念,并澄清我对以下代码片段的疑问: 案例1: 案例2: 但同时,请参见以下几行及其python解释器的输出: >>> c=257 >>> d=257 >>> id(c) 140732848419768 >>> id(d) 140732848419840 我还注意到,包含0-256值的变量的id具有相同的id值,但超出该值后,id开始变化 另一个

有人可以通过
id
command:帮助我理解与python中的值链接的内存空间的概念,并澄清我对以下代码片段的疑问: 案例1:

案例2: 但同时,请参见以下几行及其python解释器的输出:

>>> c=257
>>> d=257
>>> id(c)
140732848419768
>>> id(d)
140732848419840
我还注意到,包含0-256值的变量的id具有相同的id值,但超出该值后,id开始变化

另一个问题是,我们是否可以随时修改变量的id值。建议我


提前感谢。

您不能修改
id
。对象的
id
是在实例化时分配的,在对象的生命周期内不能更改。在CPython(标准解释器)中,它实际上是对象的内存地址,因此很明显它为什么不能更改;在其他一些Python实现中,它只是一个自动递增的整数,但您仍然无法更改它

Python有时确实会重用不可变对象,尽管这是CPython特有的实现细节,而其他Python(甚至是不同版本的CPython)的行为可能会有所不同。由于整数对象
2
无法更改,因此在任何给定环境中使用哪个实例都无关紧要;为了提高效率,Python因此保留了一个“小”整数池,而不是总是创建新的整数。(目前为-5至256(含)

字符串是另一种可以重用的对象类型。字符串文本总是被重用的,您可以使用
intern()
函数强制重用其他字符串

空元组是另一个可重用的不可变对象,并且始终具有相同的
id

如果需要更改对象的
id
,而Python并不总是将其视为单例对象,该怎么办?复制它。对于某些类型,使用类型本身可以很容易地做到这一点;e、 g.
list(my_list)
创建具有不同ID的
my_list
副本。这是一个浅层副本:如果列表包含子列表,则不会复制这些子列表,而是在原始列表和副本中显示对相同子列表的引用

列表对象也可以使用切片表示法(la
my_list[:]
)进行粗略复制(元组和其他一些序列也可以)

当您需要完整副本时,或者当您想要复制一个没有内置方式制作副本的对象时,
copy
模块已经涵盖了您。

函数
id()
在CPython中提供对象的内存地址


但是,如果我们看一下,我们可以看到
-5范围内的整数是如何看的:谢谢你的实现文档helpfulHi,你能和我分享一些参考资料以便更好地理解CPython和其他风格吗
>>> c=257
>>> d=257
>>> id(c)
140732848419768
>>> id(d)
140732848419840
static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS           257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS           5
#endif
-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS
v = (PyObject *)&small_ints[ival + NSMALLNEGINTS]