python解释器和python程序中变量分配的差异

2024-04-19 18:42:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python解释器中运行下面的代码

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

原因是什么?你知道吗


Tags: 代码iddefaultappleontypehelp解释器
3条回答

您可以在内存中使用对象位置的标识。由于整数是不可变的,因此每个整数值都是一个具有唯一id的不同对象。整数1500的id与1499不同。如果展开变量,则值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
>>> 

id(对象)
返回对象的“标识”。这是一个整数(或长整数),该整数在对象的生存期内保证是唯一的和常量。两个生命周期不重叠的对象可能具有相同的id()值

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

从该描述可以理解id(Object)返回为变量提供非重叠空间的唯一常量。你知道吗

对象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运行时)。你知道吗

相关问题 更多 >