python解释器和python程序中变量分配的区别

时间:2016-10-14 09:34:17

标签: python python-2.7 python-3.x cpython

我在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

这是什么原因?

3 个答案:

答案 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运行时)。