我可以理解以下定义:
每个对象都有一个身份、类型和值。对象的身份
一旦创建就永远不会改变;你可能会认为它是
对象在内存中的地址。这is
操作员比较身份
两个物体;这id()
函数返回一个代表其值的整数
身份。
我假设上面的定义在创建“某物”时起作用,例如:
>>> a = 0
>>> id(a)
1720438480
但是我不理解:
>>> id(1)
1720438512
>>> b = 1
>>> id(b)
1720438512
我还没有创造任何东西;那么整数“1”怎么会有ID呢?这是否意味着只要我在Python Shell中“提到”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)
?
一般来说,只要您使用整数、字符串或任何其他文字,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 是特殊情况,因为它们always存在(所以总是有相同的id
在 Python 运行时期间)。这是为了避免重复创建和销毁常用整数而进行的优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)