我在python interpreter中运行以下代码
Python 2.7.12 (default, Sep 20 2016, 14:42:48)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 300
>>> y = 300
>>> id(x)
140510001982256
>>> id(y)
140510001982160
然后我写了一个小程序并运行它:
计划:
x = 15000
y = 15000
if __name__ == "__main__":
print (id(x))
print (id(y))
输出:
$ python mem_test.py
140525354104776
140525354104776
这是什么原因?
答案 0 :(得分:0)
<强> ID(对象)强>
返回对象的“身份”。这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的。具有非重叠生存期的两个对象可能具有相同的id()值
CPython实现细节: 这是内存中对象的地址。
从该描述中,您可以理解id(Object)返回唯一常量,该常量为变量提供非重叠空间。
答案 1 :(得分:0)
你明智地在内存中使用对象位置的标识。由于整数是不可变的,因此每个整数值都是具有唯一id的独特对象。整数1500具有与1499不同的id。如果扩展变量,则值1500存储一次,其他所有内容仅指向该值,该值将引用数字1500的内存位置。
例如:
x = 1500
z = x
f = z
y = 1500
n = 1499
if __name__ == "__main__":
print (id(x))
print (id(z))
print (id(f))
print (id(y))
print (id(n))
>>>
50864556
50864556
50864556
50864556
50733712
>>>
答案 2 :(得分:0)
对象ID是实现定义的“blackbox”值。唯一的保证是给定的对象将在其所有生命周期中保持相同的id,并且在同一时间内没有其他对象(在相同的进程中......)将共享该id(但是id可以被重用于另一个对象)第一个对象被垃圾收集的过程相同。
请注意,由于性能原因,实现可以自由地缓存不可变对象,并且CPython确实在某些环境下缓存了一些不可变对象 - 特别是“小”整数(对于从版本到版本的“小”的定义) )和可能是有效变量/函数/类/模块名称的字符串,但这实际上只是一个实现细节。 FWIW,看起来这个缓存不再发生在REPL的顶级(如果它曾经发生在这里) - 但它仍然发生在REPL中定义的函数中:
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
pythonrc start
pythonrc done
>>> x = 300
>>> y = 300
>>> id(x)
37126296
>>> id(y)
37126248
>>> def foo():
... x = 300; print "id(x): %s" % id(x)
... y = 300; print "id(y): %s" % id(y)
...
>>> foo()
id(x): 37126200
id(y): 37126200
>>> foo()
id(x): 37126200
id(y): 37126200
>>> foo()
id(x): 37126200
id(y): 37126200
>>> id(x)
37126296
>>> id(y)
37126248
长话短说:你不应该关心这个(除非你自己编写自己的python运行时)。