gpt4 book ai didi

python - 当 python 添加小整数时,幕后会发生什么?

转载 作者:IT老高 更新时间:2023-10-28 20:32:43 26 4
gpt4 key购买 nike

我最近在摆弄 id 并意识到 (c?)Python 做了一些非常明智的事情:它确保小整数总是具有相同的 id

>>> a, b, c, d, e = 1, 2, 3, 4, 5
>>> f, g, h, i, j = 1, 2, 3, 4, 5
>>> [id(x) == id(y) for x, y in zip([a, b, c, d, e], [f, g, h, i, j])]
[True, True, True, True, True]

但后来我想知道数学运算的结果是否也是如此。原来是这样的:

>>> nines = [(x + y, 9) for x, y in enumerate(reversed(range(10)))]
>>> [id(x) == id(y) for x, y in nines]
[True, True, True, True, True, True, True, True, True, True]

似乎它从 n=257 开始失败...

>>> a, b = 200 + 56, 256
>>> id(a) == id(b)
True
>>> a, b = 200 + 57, 257
>>> id(a) == id(b)
False

但有时它仍然适用于更大的数字:

>>> [id(2 * x + y) == id(300 + x) for x, y in enumerate(reversed(range(301)))][:10]
[True, True, True, True, True, True, True, True, True, True]

这里发生了什么? python是怎么做到的?

最佳答案

你掉进了一个不常见的陷阱:

id(2 * x + y) == id(300 + x)

2 * x + y300 + x 这两个表达式没有重叠的生命周期。这意味着 Python 可以计算左侧,获取其 id,然后在计算右侧之前释放整数。当 CPython 释放一个整数时,它会将其放在已释放整数的列表中,然后在下次需要时将其重新用于不同的整数。因此,即使计算结果非常不同,您的 id 也会匹配:

>>> x, y = 100, 40000
>>> id(2 * x + y) == id(300 + x)
True
>>> 2 * x + y, 300 + x
(40200, 400)

关于python - 当 python 添加小整数时,幕后会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6101379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com