【问题标题】:Python 3 integer addresses [duplicate]Python 3整数地址[重复]
【发布时间】:2019-02-07 01:12:34
【问题描述】:
x=300
y=300
print(id(x),id(y))
a=[300,300]
print(id(a[0]),id(a[1]))

在执行上述代码时,我得到了 xy 的不同地址,但 a[0]a[1] 的地址相同。谁能告诉我为什么会这样?

【问题讨论】:

  • 欢迎来到 Stackoverflow !!!打开一个新的 python 解释器,然后尝试上面的示例。它将为xy 显示相同的地址。
  • 我必须使用哪个 python 编译器 @Chandila07 我已经在使用 python IDLE 3.6
  • 你可以查看我的答案。
  • 我使用 Python 3.6.5(命令行)获得了 xy 的不同 ID。

标签: python python-3.x integer python-internals


【解决方案1】:

看看下面的例子:

>>> a=256
>>> b=256
>>> print(id(a),id(b))
(31765012, 31765012)
>>> 
>>> c=257
>>> d=257
>>> print(id(c),id(d))
(44492764, 44471284)
>>>

这将帮助您了解整数的意外行为。每当您在 -5256 范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。这在 python 中称为 整数缓存

在 CPython 中,处理创建新 int 对象的 C-API 函数是 PyLong_FromLong(long v)。请参阅this link 上的文档

编辑:现在进入列表。对于相同的列表元素(更大的整数),您将获得相同的 id,因为列表是一次创建的,或者您可以一次性创建。

您也可以使用整数实现类似的行为,请参见下面的并行分配示例。

>>>
>>> a,b = 300,300
>>>
>>> print(id(a),id(b))
(36132288, 36132288)
>>>

希望这能消除您的疑虑。

【讨论】:

  • 有趣但详细说明会很好。
  • 很好的例子,+1。但我认为你只回答了一半的问题。也许您还可以说明为什么a[0]a[1] 与OP 要求的地址相同。
  • 感谢@MattMessersmith 查看我编辑的答案以获取更多信息。
  • 谢谢@BramVanroy,看看我编辑的答案,希望这有助于更多的理解。
  • @Chandila07 感谢您的澄清
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2020-12-07
  • 2021-10-30
相关资源
最近更新 更多