python - 为什么在同一行中创建的两个对象具有相同的对象,但这与列表不同?

标签 python python-internals

在下面的代码中,a 和 b 具有相同的 id

>>> a,b=470,470
>>> id(a)
32404032
>>> id(b)
32404032

但不在这里,

>>> a = 470
>>> b = 470
>>> id(a)
32403864
>>> id(b)
32344636

如果在同一行中创建相同的列表对象,则给出不同的 id

>>> a,b=[1,2], [1,2]
>>> id(a)
32086056
>>> id(b)
32653960
>>>

为什么在同一行创建的具有相同整数的变量具有相同的 id,但在不同行创建时则不同,这与列表也不同。

最佳答案

是的,对于不可变对象,编译器将创建常量并重新使用它们。但是,您不能对列表等可变对象执行此操作,因为如果您通过一个引用或另一个引用进行更改,那么您将操作同一个对象

您可以通过查看代码对象的 co_consts 属性来提取常量;获得其中之一的最简单方法是使用 compile() 函数:

>>> compile("a,b=470,470", '', 'single').co_consts
(470, None, (470, 470))

在交互式解释器中,单独的行是单独编译的,因此有单独的常量。在单独的 Python 脚本中,每个范围都有自己的常量,允许更广泛的共享。在交互式解释器中,创建一个函数或类以获得具有自己的常量的单独作用域:

>>> def foo():
...     a = 470
...     b = 470
...     return id(a) == id(b)
...
>>> foo()
True
>>> foo_code = compile('''\
... def foo():
...     a = 470
...     b = 470
...     return id(a) == id(b)
... ''', '', 'single')
>>> foo_code = compile('''
... def foo():
...     a = 470
...     b = 470
...     return id(a) == id(b)
... ''', '', 'single')
>>> foo_code.co_consts
(<code object foo at 0x1018787b0, file "", line 2>, None)
>>> foo_code.co_consts[0].co_consts  # constants for the foo function code object
(None, 470)

这些是实现细节(优化),您不应该依赖它们。

关于python - 为什么在同一行中创建的两个对象具有相同的对象,但这与列表不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43776060/

相关文章:

python - 如何构建 Boost 和编译 Boost Python

Python 条件运算符用法

python - 为什么Python2.7 dict使用的空间比Python3 dict多?

python - 在 C 中嵌入 Python : Error in linking - undefined reference to PyString_AsString

python - 为什么 Python 3.5 中的 str.translate 比 Python 3.4 快得多?

java - 最大独立组重量

python - 如何记录一个python包

python - 如何编写 Firefox 或任何基于 Mozilla 的浏览器的脚本

python - PyUnicode字符串和C字符串之间的字符串转换是如何工作的?

cython - 当扩展模块被垃圾收集时运行 cython 代码