Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Python感到困惑’;s id()_Python_Python 3.x_Memory Management_Identity - Fatal编程技术网

对Python感到困惑’;s id()

对Python感到困惑’;s id(),python,python-3.x,memory-management,identity,Python,Python 3.x,Memory Management,Identity,我可以理解以下定义: 每个对象都有一个标识、一个类型和一个值。物体的身份 一旦被创造,就永远不会改变;你可以把它看作是 对象在内存中的地址。is运算符比较 两个对象;id()函数返回一个表示其 身份 我假设上述定义在创建“某物”时有效,例如: >>> a = 0 >>> id(a) 1720438480 但我不明白: >>> id(1) 1720438512 >>> b = 1 >>> id(b) 172

我可以理解以下定义:

每个对象都有一个标识、一个类型和一个值。物体的身份 一旦被创造,就永远不会改变;你可以把它看作是 对象在内存中的地址。
is
运算符比较 两个对象;
id()
函数返回一个表示其 身份

我假设上述定义在创建“某物”时有效,例如:

>>> a = 0
>>> id(a)
1720438480
但我不明白:

>>> id(1)
1720438512
>>> b = 1
>>> id(b)
1720438512
我还没有创造任何东西;那么整数“1”怎么可能有ID呢?这是否意味着只要我在pythonshell中“提到”1,它就会被分配到一个内存地址?另外,这是否意味着,由于ID在其生命周期内从未更改,并且由于我的计算机内存有限,如果我反复询问唯一事物的ID(),我最终会收到类似“内存不足”的消息?(它无法重新分配内存,因为其他人的生存期尚未结束。)

或者,从另一个角度看我的耳朵:

>>> id(something_1)
some unique memory address
>>> id(something_2)
some unique memory address
>>> ...
内存在哪一点重新分配?就是在这个时候,

>>> my_variable = something_1
>>> id(my_variable)

将给出一个不同于
ID(something_1)

的ID。通常,只要您使用整数、字符串或任何其他文字,Python就会在内存中为您创建一个新对象。它保证在对象的生存期内具有相同的
id
,也就是说,其引用计数不为零

当你写这样的东西时:

>>> id(1000)
140497411829680
Python创建整数1000并返回其
id
(CPython中对象的内存地址)。完成此操作后,整数对象1000的引用计数为零,并将其删除。这确保了您不能仅仅通过写入
id(something)
(并且不将任何变量名绑定到对象)来不断填充内存

通常,您无法预测何时会发生重用,但在我的Python shell中,重用的发生非常一致:

>>> id(1000)
140697307078576
>>> id(1001)
140697307078576
>>> id(1002)
140697307078576
>>> id(1003)
140697307078576
您可以看到,在创建每个新整数时,相同的内存地址会被反复使用。但是,如果防止引用计数降至零,则可以看到使用了新内存:

>>> a = 1000
>>> id(a)
140697307078576
>>> b = 1001
>>> id(b)
140697306008368

在CPython中,整数-5到255是特例,因为它们总是存在(因此在Python运行时总是具有相同的
id
)。这是一种优化,以避免重复创建和销毁常用整数。

Hi Alex。如果有一个虚拟内存,并且程序被多次换入/换出,该怎么办?它不会改变同一变量的物理内存地址吗?CPython不会使用垃圾收集来清除未引用的对象。引用计数降至0时,对象即被删除。因此,是的,
id(1000)
将创建一个值为1000的
int
对象,唯一的引用是堆栈,
id()
为该对象生成一个值,该对象将从堆栈中清除并立即删除,因为引用计数现在为0。Python确实有一个垃圾收集器,但它所负责的只是中断循环引用。对于小数字,范围是。请注意,特别是对于小整数,
id
s按照重用。